• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022-2025 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 #ifdef OHOS_BUILD_ENABLE_HITRACE
25 #include <hitrace_meter.h>
26 #endif // OHOS_BUILD_ENABLE_HITRACE
27 
28 #include "ability_info.h"
29 #include "accessibility_event_info.h"
30 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
31 #include "accessibility_power_manager.h"
32 #endif
33 #include "accessibility_short_key_dialog.h"
34 #include "accessibility_window_manager.h"
35 #include "hilog_wrapper.h"
36 #include "input_manager.h"
37 #include "iservice_registry.h"
38 #include "os_account_manager.h"
39 #include "parameter.h"
40 #include "parameters.h"
41 #include "system_ability_definition.h"
42 #include "utils.h"
43 #include "xcollie_helper.h"
44 #include <ipc_skeleton.h>
45 #include "transaction/rs_interfaces.h"
46 #include "resource_manager.h"
47 #include "res_config.h"
48 #include "bundle_info.h"
49 #include "locale_config.h"
50 #include "locale_info.h"
51 #include "accesstoken_kit.h"
52 #include "tokenid_kit.h"
53 #include "accessibility_caption.h"
54 #include "msdp_manager.h"
55 #include "accessibility_permission.h"
56 #include "mem_mgr_client.h"
57 #include "mem_mgr_proxy.h"
58 #include "magnification_def.h"
59 
60 using namespace std;
61 using namespace OHOS::Security::AccessToken;
62 using namespace OHOS::AccessibilityConfig;
63 
64 namespace OHOS {
65 namespace Accessibility {
66 namespace {
67     const char* AAMS_SERVICE_NAME = "AccessibleAbilityManagerService";
68     const char* AAMS_ACTION_RUNNER_NAME = "AamsActionRunner";
69     const char* AAMS_SEND_EVENT_RUNNER_NAME = "AamsSendEventRunner";
70     const char* AAMS_CHANNEL_RUNNER_NAME = "AamsChannelRunner";
71     const char* AAMS_INPUT_MANAGER_RUNNER_NAME = "AamsInputManagerRunner";
72     const char* AAMS_GESTURE_RUNNER_NAME = "AamsGestureRunner";
73     const char* AAMS_HOVER_ENTER_RUNNER_NAME = "AamsHoverEnterRunner";
74     const char* AAMS_REGISTER_RUNNER_NAME = "AamsRegisterRunner";
75     const char* SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
76     const char* SCREEN_READER_BUNDLE_ABILITY_NAME = "com.ohos.screenreader/AccessibilityExtAbility";
77     const char* DEVICE_PROVISIONED = "device_provisioned";
78     const char* SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
79     const char* SCREEN_MAGNIFICATION_TYPE = "accessibility_magnification_capability";
80     const char* SCREEN_MAGNIFICATION_MODE = "accessibility_magnification_mode";
81     const char* SCREEN_MAGNIFICATION_SCALE = "accessibility_display_magnification_scale";
82     const char* MAGNIFICATION_PARAM = "const.accessibility.magnification";
83     const char* VOICE_RECOGNITION_KEY = "accessibility_sound_recognition_switch";
84     const char* VOICE_RECOGNITION_TYPES = "accessibility_sound_recognition_enabled";
85     const char* DELAY_UNLOAD_TASK = "TASK_UNLOAD_ACCESSIBILITY_SA";
86     const char* USER_SETUP_COMPLETED = "user_setup_complete";
87     const char* ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
88     const char* SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
89     const char* HAP_PATH = "/system/app/Settings/Settings.hap";
90     const char* HAP_BUNDLE = "com.ohos.settings";
91     const char* UI_TEST_BUNDLE_NAME = "ohos.uitest";
92     const char* UI_TEST_ABILITY_NAME = "uitestability";
93     constexpr int32_t INVALID_SHORTCUT_STATE = 2;
94     constexpr int32_t QUERY_USER_ID_RETRY_COUNT = 600;
95     constexpr int32_t QUERY_USER_ID_SLEEP_TIME = 50;
96     constexpr int32_t REQUEST_ID_MAX = 0xFFFFFFFF;
97     constexpr int32_t REQUEST_ID_MIN = 0x0000FFFF;
98     constexpr int32_t DEFAULT_ACCOUNT_ID = 100;
99     constexpr int32_t ROOT_UID = 0;
100     constexpr int32_t UNLOAD_TASK_INTERNAL = 3 * 60 * 1000; // ms
101     constexpr int32_t TREE_ID_INVALID = 0;
102     constexpr uint32_t ELEMENT_MOVE_BIT = 40;
103     constexpr int32_t SINGLE_TREE_ID = 0;
104     constexpr int32_t SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
105     constexpr int32_t SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
106     constexpr int32_t WINDOW_ID_INVALID = -1;
107     constexpr int64_t ELEMENT_ID_INVALID = -1;
108     enum SCREENREADER_STATE : int32_t {
109         UNINIT = -1,
110         OFF = 0,
111         ON = 1,
112     };
113     const char* TIMER_REGISTER_STATE_OBSERVER = "accessibility:registerStateObServer";
114     const char* TIMER_REGISTER_CAPTION_OBSERVER = "accessibility:registerCaptionObServer";
115     const char* TIMER_REGISTER_ENABLEABILITY_OBSERVER = "accessibility:registerEnableAbilityObServer";
116     const char* TIMER_GET_ALL_CONFIG = "accessibility:getAllConfig";
117     const char* TIMER_REGISTER_CONFIG_OBSERVER = "accessibility:registerConfigObserver";
118     const char* MAGNIFICATION_SCALE = "magnification_scale";
119     const char* MAGNIFICATION_DISABLE = "magnification_disabled";
120     const char* SWITCH_FULL_SCREEN = "switch_full_screen_magnification";
121     const char* SWITCH_WINDOW = "switch_window_magnification";
122     constexpr int32_t XCOLLIE_TIMEOUT = 6; // s
123     constexpr int QUANTITY = 2; // plural string
124 
125     static const std::map<std::string, int32_t> AccessibilityConfigTable = {
126         {"HIGH_CONTRAST_TEXT", HIGH_CONTRAST_TEXT},
127         {"INVERT_COLOR", INVERT_COLOR},
128         {"DALTONIZATION_COLOR_FILTER", DALTONIZATION_COLOR_FILTER},
129         {"CONTENT_TIMEOUT", CONTENT_TIMEOUT},
130         {"ANIMATION_OFF", ANIMATION_OFF},
131         {"BRIGHTNESS_DISCOUNT", BRIGHTNESS_DISCOUNT},
132         {"AUDIO_MONO", AUDIO_MONO},
133         {"AUDIO_BALANCE", AUDIO_BALANCE},
134         {"MOUSE_KEY", MOUSE_KEY},
135         {"CAPTION_STATE", CAPTION_STATE},
136         {"CAPTION_STYLE", CAPTION_STYLE},
137         {"SCREEN_MAGNIFICATION", SCREEN_MAGNIFICATION},
138         {"MOUSE_AUTOCLICK", MOUSE_AUTOCLICK}
139     };
140 
141     static std::map<std::string, std::string> ResourceMap = {
142         {MAGNIFICATION_SCALE, ""},
143         {MAGNIFICATION_DISABLE, ""},
144         {SWITCH_FULL_SCREEN, ""},
145         {SWITCH_WINDOW, ""}
146     };
147 } // namespace
148 
149 const bool REGISTER_RESULT =
150     SystemAbility::MakeAndRegisterAbility(&Singleton<AccessibleAbilityManagerService>::GetInstance());
151 
AccessibleAbilityManagerService()152 AccessibleAbilityManagerService::AccessibleAbilityManagerService()
153     : SystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, true)
154 {
155     HILOG_INFO("AccessibleAbilityManagerService is constructed");
156     dependentServicesStatus_[ABILITY_MGR_SERVICE_ID] = false;
157     dependentServicesStatus_[BUNDLE_MGR_SERVICE_SYS_ABILITY_ID] = false;
158     dependentServicesStatus_[COMMON_EVENT_SERVICE_ID] = false;
159     dependentServicesStatus_[DISPLAY_MANAGER_SERVICE_SA_ID] = false;
160     dependentServicesStatus_[SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN] = false;
161     dependentServicesStatus_[WINDOW_MANAGER_SERVICE_ID] = false;
162     dependentServicesStatus_[DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID] = false;
163 
164     accessibilitySettings_ = std::make_shared<AccessibilitySettings>();
165     accessibilityShortKey_ = std::make_shared<AccessibilityShortKey>();
166 }
167 
~AccessibleAbilityManagerService()168 AccessibleAbilityManagerService::~AccessibleAbilityManagerService()
169 {
170     HILOG_INFO("AccessibleAbilityManagerService::~AccessibleAbilityManagerService");
171 
172     inputInterceptor_ = nullptr;
173     touchEventInjector_ = nullptr;
174     keyEventFilter_ = nullptr;
175     a11yAccountsData_.Clear();
176 }
177 
InitHandler()178 void AccessibleAbilityManagerService::InitHandler()
179 {
180     if (!runner_) {
181         runner_ = AppExecFwk::EventRunner::Create(AAMS_SERVICE_NAME, AppExecFwk::ThreadMode::FFRT);
182         if (!runner_) {
183             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS runner failed");
184             return;
185         }
186     }
187 
188     if (!handler_) {
189         handler_ = std::make_shared<AAMSEventHandler>(runner_);
190         if (!handler_) {
191             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS event handler failed");
192             return;
193         }
194     }
195 }
196 
InitActionHandler()197 void AccessibleAbilityManagerService::InitActionHandler()
198 {
199     if (!actionRunner_) {
200         actionRunner_ = AppExecFwk::EventRunner::Create(AAMS_ACTION_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
201         if (!actionRunner_) {
202             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS action runner failed");
203             return;
204         }
205     }
206 
207     if (!actionHandler_) {
208         actionHandler_ = std::make_shared<AAMSEventHandler>(actionRunner_);
209         if (!actionHandler_) {
210             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS action handler failed");
211             return;
212         }
213     }
214 }
215 
InitSendEventHandler()216 void AccessibleAbilityManagerService::InitSendEventHandler()
217 {
218     if (!sendEventRunner_) {
219         sendEventRunner_ = AppExecFwk::EventRunner::Create(AAMS_SEND_EVENT_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
220         if (!sendEventRunner_) {
221             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS sendEvent runner failed");
222             return;
223         }
224     }
225 
226     if (!sendEventHandler_) {
227         sendEventHandler_ = std::make_shared<AAMSEventHandler>(sendEventRunner_);
228         if (!sendEventHandler_) {
229             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS sendEvent handler failed");
230             return;
231         }
232     }
233 }
234 
InitChannelHandler()235 void AccessibleAbilityManagerService::InitChannelHandler()
236 {
237     if (!channelRunner_) {
238         channelRunner_ = AppExecFwk::EventRunner::Create(AAMS_CHANNEL_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
239         if (!channelRunner_) {
240             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS channel runner failed");
241             return;
242         }
243     }
244 
245     if (!channelHandler_) {
246         channelHandler_ = std::make_shared<AAMSEventHandler>(channelRunner_);
247         if (!channelHandler_) {
248             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS channel handler failed");
249             return;
250         }
251     }
252 }
253 
InitInputManagerHandler()254 void AccessibleAbilityManagerService::InitInputManagerHandler()
255 {
256     if (!inputManagerRunner_) {
257 #ifdef ACCESSIBILITY_WATCH_FEATURE
258         inputManagerRunner_ = AppExecFwk::EventRunner::Create(AAMS_INPUT_MANAGER_RUNNER_NAME);
259 #else
260         inputManagerRunner_ = AppExecFwk::EventRunner::Create(AAMS_INPUT_MANAGER_RUNNER_NAME,
261             AppExecFwk::ThreadMode::FFRT);
262 #endif
263         if (!inputManagerRunner_) {
264             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS input manager runner failed");
265             return;
266         }
267     }
268 }
269 
InitGestureHandler()270 void AccessibleAbilityManagerService::InitGestureHandler()
271 {
272     if (!gestureRunner_) {
273         gestureRunner_ = AppExecFwk::EventRunner::Create(AAMS_GESTURE_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
274         if (!gestureRunner_) {
275             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS gesture runner failed");
276             return;
277         }
278     }
279 }
280 
InitHoverEnterHandler()281 void AccessibleAbilityManagerService::InitHoverEnterHandler()
282 {
283     if (!hoverEnterRunner_) {
284         hoverEnterRunner_ = AppExecFwk::EventRunner::Create(AAMS_HOVER_ENTER_RUNNER_NAME, AppExecFwk::ThreadMode::FFRT);
285         if (!hoverEnterRunner_) {
286             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS hoverEnter runner failed");
287             return;
288         }
289     }
290 
291     if (!hoverEnterHandler_) {
292         hoverEnterHandler_ = std::make_shared<AAMSEventHandler>(hoverEnterRunner_);
293         if (!hoverEnterHandler_) {
294             HILOG_ERROR("AccessibleAbilityManagerService::OnStart failed:create AAMS hoverEnter handler failed");
295             return;
296         }
297     }
298 }
299 
OnStart()300 void AccessibleAbilityManagerService::OnStart()
301 {
302     HILOG_INFO("AccessibleAbilityManagerService::OnStart start");
303 
304     InitHandler();
305     InitActionHandler();
306     InitSendEventHandler();
307     InitChannelHandler();
308     InitInputManagerHandler();
309     InitGestureHandler();
310     InitHoverEnterHandler();
311 
312     SetParameter(SYSTEM_PARAMETER_AAMS_NAME, "false");
313 
314     HILOG_DEBUG("AddAbilityListener!");
315     AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID);
316     AddSystemAbilityListener(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
317     AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
318     AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
319     AddSystemAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN);
320     AddSystemAbilityListener(WINDOW_MANAGER_SERVICE_ID);
321     AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
322     AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
323 
324     accessibilitySettings_->RegisterSettingsHandler(handler_);
325 }
326 
OnStop()327 void AccessibleAbilityManagerService::OnStop()
328 {
329     HILOG_INFO("stop AccessibleAbilityManagerService");
330     if (!handler_) {
331         HILOG_ERROR("AccessibleAbilityManagerService::OnStop failed!");
332         return;
333     }
334 
335     ffrt::promise<void> syncPromise;
336     ffrt::future syncFuture = syncPromise.get_future();
337     handler_->PostTask([this, &syncPromise]() {
338         HILOG_DEBUG();
339 
340         Singleton<AccessibilityCommonEvent>::GetInstance().UnSubscriberEvent();
341 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
342         Singleton<AccessibilityDisplayManager>::GetInstance().UnregisterDisplayListener();
343 #endif
344         Singleton<AccessibilityWindowManager>::GetInstance().DeregisterWindowListener();
345         UnsubscribeOsAccount();
346 
347         currentAccountId_ = -1;
348         a11yAccountsData_.Clear();
349         stateObservers_.Clear();
350         inputInterceptor_ = nullptr;
351         touchEventInjector_ = nullptr;
352         keyEventFilter_ = nullptr;
353         stateObserversDeathRecipient_ = nullptr;
354 
355         syncPromise.set_value();
356         }, "TASK_ONSTOP");
357     syncFuture.wait();
358 
359     for (auto &iter : dependentServicesStatus_) {
360         iter.second = false;
361     }
362 
363     isReady_ = false;
364     isPublished_ = false;
365     SetParameter(SYSTEM_PARAMETER_AAMS_NAME, "false");
366     int pid = getpid();
367     Memory::MemMgrClient::GetInstance().NotifyProcessStatus(pid, 1, 0, ACCESSIBILITY_MANAGER_SERVICE_ID);
368     HILOG_INFO("AccessibleAbilityManagerService::OnStop OK.");
369 }
370 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)371 void AccessibleAbilityManagerService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
372 {
373     HILOG_DEBUG("systemAbilityId:%{public}d added!", systemAbilityId);
374     if (!handler_) {
375         HILOG_DEBUG("Event handler is nullptr.");
376         return;
377     }
378 
379     handler_->PostTask([=]() {
380         if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
381             int pid = getpid();
382             Memory::MemMgrClient::GetInstance().NotifyProcessStatus(pid, 1, 1, ACCESSIBILITY_MANAGER_SERVICE_ID);
383             return;
384         }
385         auto iter = dependentServicesStatus_.find(systemAbilityId);
386         if (iter == dependentServicesStatus_.end()) {
387             HILOG_ERROR("SystemAbilityId is not found!");
388             return;
389         }
390 
391         dependentServicesStatus_[systemAbilityId] = true;
392         if (std::any_of(dependentServicesStatus_.begin(), dependentServicesStatus_.end(),
393             [](const std::map<int32_t, bool>::value_type &status) { return !status.second; })) {
394             HILOG_DEBUG("Not all the dependence is ready!");
395             return;
396         }
397 
398         if (Init() == false) {
399             HILOG_ERROR("AccessibleAbilityManagerService::Init failed!");
400             return;
401         }
402 
403         if (!isPublished_) {
404             if (Publish(this) == false) {
405                 HILOG_ERROR("AccessibleAbilityManagerService::Publish failed!");
406                 return;
407             }
408             isPublished_ = true;
409         }
410 
411         InitInnerResource();
412 
413         isReady_ = true;
414         SetParameter(SYSTEM_PARAMETER_AAMS_NAME, "true");
415         HILOG_DEBUG("AAMS is ready!");
416         RegisterShortKeyEvent();
417         PostDelayUnloadTask();
418         RegisterScreenMagnificationState();
419         RegisterScreenMagnificationType();
420         RegisterVoiceRecognitionState();
421         if (accessibilitySettings_) {
422             accessibilitySettings_->RegisterParamWatcher();
423         }
424         }, "OnAddSystemAbility");
425 }
426 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)427 void AccessibleAbilityManagerService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
428 {
429     HILOG_INFO("systemAbilityId:%{public}d removed!", systemAbilityId);
430     Utils::RecordOnRemoveSystemAbility(systemAbilityId);
431     if (!handler_) {
432         HILOG_DEBUG("Event handler is nullptr.");
433         return;
434     }
435 
436     handler_->PostTask([=]() {
437         HILOG_INFO("Remove system ability start");
438         auto iter = dependentServicesStatus_.find(systemAbilityId);
439         if (iter == dependentServicesStatus_.end()) {
440             HILOG_ERROR("SystemAbilityId is not found!");
441             return;
442         }
443 
444         dependentServicesStatus_[systemAbilityId] = false;
445         if (isReady_) {
446             SwitchedUser(-1);
447             Singleton<AccessibilityCommonEvent>::GetInstance().UnSubscriberEvent();
448 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
449             Singleton<AccessibilityDisplayManager>::GetInstance().UnregisterDisplayListener();
450 #endif
451             Singleton<AccessibilityWindowManager>::GetInstance().DeregisterWindowListener();
452             Singleton<AccessibilityWindowManager>::GetInstance().DeInit();
453 
454             isReady_ = false;
455             SetParameter(SYSTEM_PARAMETER_AAMS_NAME, "false");
456         }
457 
458         if (systemAbilityId == DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
459             sptr<AccessibilityAccountData> accountData =
460                 Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
461             if (accountData == nullptr) {
462                 HILOG_ERROR("get accountData failed");
463                 return;
464             }
465             auto config = accountData->GetConfig();
466             if (config == nullptr) {
467                 HILOG_ERROR("config is nullptr");
468                 return;
469             }
470             config->SetInitializeState(false);
471         }
472         }, "OnRemoveSystemAbility");
473 }
474 
Dump(int fd,const std::vector<std::u16string> & args)475 int AccessibleAbilityManagerService::Dump(int fd, const std::vector<std::u16string>& args)
476 {
477     HILOG_DEBUG("dump AccessibilityManagerServiceInfo");
478     if (!handler_) {
479         HILOG_ERROR("Parameters check failed!");
480         return RET_ERR_NULLPTR;
481     }
482     ffrt::promise<int> syncPromise;
483     ffrt::future syncFuture = syncPromise.get_future();
484     handler_->PostTask([this, &syncPromise, fd, args]() {
485         if (!accessibilityDumper_) {
486             accessibilityDumper_ = new(std::nothrow) AccessibilityDumper();
487             if (!accessibilityDumper_) {
488                 HILOG_ERROR("accessibilityDumper_ is nullptr");
489                 syncPromise.set_value(-1);
490                 return;
491             }
492         }
493         syncPromise.set_value(accessibilityDumper_->Dump(fd, args));
494         }, "TASK_DUMP_INFO");
495     return syncFuture.get();
496 }
497 
VerifyingToKenId(const int32_t windowId,const int64_t elementId)498 RetError AccessibleAbilityManagerService::VerifyingToKenId(const int32_t windowId, const int64_t elementId)
499 {
500     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
501     int32_t treeId = (static_cast<uint64_t>(elementId) >> ELEMENT_MOVE_BIT);
502     HILOG_DEBUG("VerifyingToKenId: treeId[%{public}d], windowId[%{public}d], elementId[%{public}" PRId64 "]",
503         treeId, windowId, elementId);
504     if (elementId == ELEMENT_ID_INVALID || windowId == WINDOW_ID_INVALID) {
505         HILOG_DEBUG("windowId[%{public}d], elementId[%{public}" PRId64 "]", windowId, elementId);
506         return RET_OK;
507     }
508     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
509     if (accountData == nullptr) {
510         Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
511             A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
512             HILOG_ERROR("Get current account data failed!!");
513             return RET_ERR_CONNECTION_EXIST;
514     }
515     HILOG_DEBUG("treeId %{public}d, windowId %{public}d", treeId, windowId);
516     int32_t realId =
517         Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
518     sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(realId);
519     if (connection == nullptr) {
520         HILOG_ERROR("connection is empty.");
521         return RET_ERR_REGISTER_EXIST;
522     }
523     uint32_t expectTokenId = connection->GetTokenIdMap(treeId);
524     if (tokenId != expectTokenId) {
525         HILOG_ERROR("tokenId error!");
526         return RET_ERR_TOKEN_ID;
527     }
528 
529     return RET_OK;
530 }
531 
SendEvent(const AccessibilityEventInfoParcel & eventInfoParcel,const int32_t flag)532 ErrCode AccessibleAbilityManagerService::SendEvent(const AccessibilityEventInfoParcel &eventInfoParcel,
533     const int32_t flag)
534 {
535     AccessibilityEventInfo uiEvent = static_cast<AccessibilityEventInfo>(eventInfoParcel);
536     EventType eventType = uiEvent.GetEventType();
537     HILOG_DEBUG("eventType[%{public}d] gestureId[%{public}d] windowId[%{public}d] compnentId: %{public}" PRId64 " "
538         "elementId: %{public}" PRId64 " winId: %{public}d innerWinId: %{public}d treeId: %{public}d",
539         uiEvent.GetEventType(), uiEvent.GetGestureType(), uiEvent.GetWindowId(), uiEvent.GetAccessibilityId(),
540         uiEvent.GetElementInfo().GetAccessibilityId(), uiEvent.GetElementInfo().GetWindowId(),
541         uiEvent.GetElementInfo().GetInnerWindowId(), uiEvent.GetElementInfo().GetBelongTreeId());
542     if (!sendEventHandler_ || !hoverEnterHandler_) {
543         HILOG_ERROR("Parameters check failed!");
544         return RET_ERR_NULLPTR;
545     }
546     if (flag) {
547         if (VerifyingToKenId(uiEvent.GetElementInfo().GetWindowId(),
548             uiEvent.GetElementInfo().GetAccessibilityId()) == RET_OK) {
549         } else {
550             HILOG_ERROR("VerifyingToKenId failed");
551             return RET_ERR_CONNECTION_EXIST;
552         }
553     }
554 
555     RetError res = GetResourceBundleInfo(const_cast<AccessibilityEventInfo&>(uiEvent));
556     if (res != RET_OK) {
557         HILOG_ERROR("Get Resource BundleInfo failed! RetError is %{public}d", res);
558     }
559 
560     auto sendEventTask = [this, uiEvent]() {
561         HILOG_DEBUG();
562         OnFocusedEvent(uiEvent);
563         UpdateAccessibilityWindowStateByEvent(uiEvent);
564         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
565         if (!accountData) {
566             HILOG_ERROR("accountData is nullptr.");
567             return;
568         }
569 
570         const_cast<AccessibilityEventInfo&>(uiEvent).SetTimeStamp(Utils::GetSystemTime());
571         map<string, sptr<AccessibleAbilityConnection>> abilities = accountData->GetConnectedA11yAbilities();
572         for (auto &ability : abilities) {
573             if (ability.second) {
574                 ability.second->OnAccessibilityEvent(const_cast<AccessibilityEventInfo&>(uiEvent));
575             }
576         }
577     };
578 
579     if (eventType == TYPE_VIEW_HOVER_ENTER_EVENT) {
580         hoverEnterHandler_->PostTask(sendEventTask, "TASK_SEND_EVENT");
581     } else {
582         sendEventHandler_->PostTask(sendEventTask, "TASK_SEND_EVENT");
583     }
584 
585     return RET_OK;
586 }
587 
RegisterStateObserver(const sptr<IAccessibleAbilityManagerStateObserver> & stateObserver,uint32_t & state)588 ErrCode AccessibleAbilityManagerService::RegisterStateObserver(
589     const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver, uint32_t &state)
590 {
591     HILOG_DEBUG();
592     if (!stateObserver || !handler_) {
593         HILOG_ERROR("parameters check failed!");
594         return ERR_INVALID_DATA;
595     }
596     XCollieHelper timer(TIMER_REGISTER_STATE_OBSERVER, XCOLLIE_TIMEOUT);
597     std::lock_guard<ffrt::mutex> lock(mutex_);
598     if (!stateObserversDeathRecipient_) {
599         stateObserversDeathRecipient_ = new(std::nothrow) StateCallbackDeathRecipient();
600         if (!stateObserversDeathRecipient_) {
601             HILOG_ERROR("stateObserversDeathRecipient_ is null");
602             return ERR_INVALID_DATA;
603         }
604     }
605 
606     if (!stateObserver->AsObject()) {
607         HILOG_ERROR("object is null");
608         return ERR_INVALID_DATA;
609     }
610 
611     stateObserver->AsObject()->AddDeathRecipient(stateObserversDeathRecipient_);
612     stateObservers_.AddStateObserver(stateObserver);
613     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
614     if (accountData == nullptr) {
615         return ERR_INVALID_DATA;
616     }
617 
618     state = accountData->GetAccessibilityState();
619     return ERR_OK;
620 }
621 
GetRealWindowAndElementId(int32_t & windowId,int64_t & elementId)622 ErrCode AccessibleAbilityManagerService::GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId)
623 {
624     HILOG_DEBUG("real windowId %{public}d", windowId);
625     if (!handler_) {
626         return ERR_INVALID_DATA;
627     }
628 
629     ffrt::promise<ErrCode> syncPromise;
630     ffrt::future syncFuture = syncPromise.get_future();
631     handler_->PostTask([&, this]() {
632         Singleton<AccessibilityWindowManager>::GetInstance().GetRealWindowAndElementId(windowId, elementId);
633         syncPromise.set_value(ERR_OK);
634         }, "GET_REAL_WINDOW_AND_ELEMENT_ID");
635     return syncFuture.get();
636 }
637 
GetSceneBoardInnerWinId(int32_t windowId,int64_t elementId,int32_t & innerWid)638 ErrCode AccessibleAbilityManagerService::GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId,
639     int32_t& innerWid)
640 {
641     HILOG_DEBUG("real windowId %{public}d", windowId);
642     if (!handler_) {
643         return ERR_INVALID_DATA;
644     }
645 
646     ffrt::promise<ErrCode> syncPromise;
647     ffrt::future syncFuture = syncPromise.get_future();
648     handler_->PostTask([&, this]() {
649         Singleton<AccessibilityWindowManager>::GetInstance().GetSceneBoardInnerWinId(windowId, elementId, innerWid);
650         syncPromise.set_value(ERR_OK);
651         }, "GET_SCENE_BOARD_INNER_WINDOW_ID");
652     return syncFuture.get();
653 }
654 
GetRealIdConnection()655 sptr<AccessibilityWindowConnection> AccessibleAbilityManagerService::GetRealIdConnection()
656 {
657     HILOG_DEBUG();
658     int32_t windowId = ANY_WINDOW_ID;
659     int32_t focusType = FOCUS_TYPE_ACCESSIBILITY;
660     int32_t realId = Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, focusType);
661 
662     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
663     if (!accountData) {
664         HILOG_ERROR("GetCurrentAccountData failed");
665         return sptr<AccessibilityWindowConnection>();
666     }
667     return accountData->GetAccessibilityWindowConnection(realId);
668 }
669 
FindFocusedElementByConnection(sptr<AccessibilityWindowConnection> connection,AccessibilityElementInfo & elementInfo)670 bool AccessibleAbilityManagerService::FindFocusedElementByConnection(sptr<AccessibilityWindowConnection> connection,
671     AccessibilityElementInfo &elementInfo)
672 {
673     HILOG_DEBUG();
674     int64_t elementId = -1;
675     int32_t focusType = FOCUS_TYPE_ACCESSIBILITY;
676     if (!connection || !connection->GetProxy()) {
677         HILOG_ERROR("GetAccessibilityWindowConnection failed");
678         return false;
679     }
680 
681     uint32_t timeOut = 5000;
682     sptr<ElementOperatorCallbackImpl> focusCallback = new(std::nothrow) ElementOperatorCallbackImpl();
683     if (!focusCallback) {
684         HILOG_ERROR("Failed to create focusCallback.");
685         return false;
686     }
687     ffrt::future<void> focusFuture = focusCallback->promise_.get_future();
688     connection->GetProxy()->FindFocusedElementInfo(elementId, focusType, GenerateRequestId(), focusCallback);
689     ffrt::future_status waitFocus = focusFuture.wait_for(std::chrono::milliseconds(timeOut));
690     if (waitFocus != ffrt::future_status::ready) {
691         HILOG_ERROR("FindFocusedElementInfo Failed to wait result");
692         return false;
693     }
694     elementInfo = focusCallback->accessibilityInfoResult_;
695     return true;
696 }
697 
FindFocusedElement(AccessibilityElementInfo & elementInfo,uint32_t timeout)698 bool AccessibleAbilityManagerService::FindFocusedElement(AccessibilityElementInfo &elementInfo, uint32_t timeout)
699 {
700     HILOG_DEBUG();
701     sptr<AccessibilityWindowConnection> connection = GetRealIdConnection();
702     FindFocusedElementByConnection(connection, elementInfo);
703     if (elementInfo.GetAccessibilityId() >= 0) {
704         HILOG_DEBUG("find focused element success.");
705         return true;
706     }
707     int32_t windowId = GetFocusWindowId();
708     int64_t elementId = GetFocusElementId();
709     sptr<IAccessibilityElementOperator> elementOperator = nullptr;
710     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
711     RETURN_FALSE_IF_NULL(accountData);
712     int32_t realId =
713         Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
714     connection = accountData->GetAccessibilityWindowConnection(realId);
715     HILOG_DEBUG("windowId[%{public}d], elementId[%{public}" PRId64 "]", windowId, elementId);
716     RETURN_FALSE_IF_NULL(connection);
717     sptr<ElementOperatorCallbackImpl> callBack = new(std::nothrow) ElementOperatorCallbackImpl();
718     RETURN_FALSE_IF_NULL(callBack);
719     ffrt::future<void> promiseFuture = callBack->promise_.get_future();
720     GetElementOperatorConnection(connection, elementId, elementOperator);
721     RETURN_FALSE_IF_NULL(elementOperator);
722     elementOperator->SearchElementInfoByAccessibilityId(elementId, GenerateRequestId(), callBack, 0);
723     ffrt::future_status waitFocus = promiseFuture.wait_for(std::chrono::milliseconds(timeout));
724     if (waitFocus != ffrt::future_status::ready) {
725         ipcTimeoutNum_++;
726         HILOG_ERROR("Failed to wait result, number %{public}" PRId64 "", ipcTimeoutNum_);
727         return false;
728     }
729 
730     if (callBack->elementInfosResult_.size() <= 0) {
731         HILOG_ERROR("SearchElementInfoByAccessibilityId return null");
732         return false;
733     }
734     elementInfo = callBack->elementInfosResult_[0];
735     return true;
736 }
737 
GetElementOperatorConnection(sptr<AccessibilityWindowConnection> & connection,const int64_t elementId,sptr<IAccessibilityElementOperator> & elementOperator)738 void AccessibleAbilityManagerService::GetElementOperatorConnection(sptr<AccessibilityWindowConnection> &connection,
739     const int64_t elementId, sptr<IAccessibilityElementOperator> &elementOperator)
740 {
741     int32_t treeId = 0;
742     if (elementId > 0) {
743         treeId = GetTreeIdBySplitElementId(elementId);
744         elementOperator = connection->GetCardProxy(treeId);
745     } else {
746         elementOperator = connection->GetProxy();
747     }
748     HILOG_DEBUG("elementId:%{public}" PRId64 " treeId:%{public}d", elementId, treeId);
749 }
750 
ExecuteActionOnAccessibilityFocused(const ActionType & action)751 bool AccessibleAbilityManagerService::ExecuteActionOnAccessibilityFocused(const ActionType &action)
752 {
753     int32_t windowId = GetFocusWindowId();
754     int64_t elementId = GetFocusElementId();
755     uint32_t timeOut = 5000;
756     int32_t treeId = GetTreeIdBySplitElementId(elementId);
757     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
758     if (accountData == nullptr) {
759         HILOG_ERROR("GetCurrentAccountData failed");
760         return false;
761     }
762     int32_t realId =
763         Singleton<AccessibilityWindowManager>::GetInstance().ConvertToRealWindowId(windowId, FOCUS_TYPE_INVALID);
764     sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(realId);
765     if (connection == nullptr) {
766         HILOG_ERROR("connection is nullptr");
767         return false;
768     }
769     std::map<std::string, std::string> actionArguments {};
770     AccessibilityElementInfo focusedElementInfo {};
771     bool ret = Singleton<AccessibleAbilityManagerService>::GetInstance().FindFocusedElement(focusedElementInfo);
772     if (ret) {
773         actionArguments = AccessibilitySecurityComponentManager::GenerateActionArgumentsWithHMAC(action,
774             focusedElementInfo.GetUniqueId(), focusedElementInfo.GetBundleName(), actionArguments);
775     }
776     sptr<ElementOperatorCallbackImpl> actionCallback = new(std::nothrow) ElementOperatorCallbackImpl();
777     if (actionCallback == nullptr) {
778         HILOG_ERROR("Failed to create actionCallback.");
779         return false;
780     }
781     ffrt::future<void> actionFuture = actionCallback->promise_.get_future();
782     if (treeId > TREE_ID_INVALID) {
783         if (connection->GetCardProxy(treeId) != nullptr) {
784             connection->GetCardProxy(treeId)->ExecuteAction(elementId, action,
785                 actionArguments, GenerateRequestId(), actionCallback);
786         } else {
787             HILOG_ERROR("get operation is nullptr");
788             return false;
789         }
790     } else {
791         if (connection->GetProxy() != nullptr) {
792             connection->GetProxy()->ExecuteAction(elementId, action, actionArguments, GenerateRequestId(),
793                 actionCallback);
794         } else {
795             HILOG_ERROR("get operation is nullptr");
796             return false;
797         }
798     }
799     ffrt::future_status waitAction = actionFuture.wait_for(std::chrono::milliseconds(timeOut));
800     if (waitAction != ffrt::future_status::ready) {
801         HILOG_ERROR("ExecuteAction Failed to wait result");
802         return false;
803     }
804     HILOG_INFO("windowId[%{public}d], elementId[%{public}" PRId64 "], action[%{public}d, result: %{public}d",
805         windowId, elementId, action, actionCallback->executeActionResult_);
806     return actionCallback->executeActionResult_;
807 }
808 
SetFocusWindowId(const int32_t focusWindowId)809 void AccessibleAbilityManagerService::SetFocusWindowId(const int32_t focusWindowId)
810 {
811     focusWindowId_ = focusWindowId;
812 }
813 
GetFocusWindowId()814 int32_t AccessibleAbilityManagerService::GetFocusWindowId()
815 {
816     return focusWindowId_;
817 }
818 
SetFocusElementId(const int64_t focusElementId)819 void AccessibleAbilityManagerService::SetFocusElementId(const int64_t focusElementId)
820 {
821     focusElementId_ = focusElementId;
822 }
823 
GetFocusElementId()824 int64_t AccessibleAbilityManagerService::GetFocusElementId()
825 {
826     return focusElementId_;
827 }
828 
RegisterCaptionObserver(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)829 ErrCode AccessibleAbilityManagerService::RegisterCaptionObserver(
830     const sptr<IAccessibleAbilityManagerCaptionObserver> &callback)
831 {
832     HILOG_DEBUG();
833     if (!callback || !actionHandler_) {
834         HILOG_ERROR("Parameters check failed!");
835         return ERR_INVALID_VALUE;
836     }
837 
838     XCollieHelper timer(TIMER_REGISTER_CAPTION_OBSERVER, XCOLLIE_TIMEOUT);
839     std::shared_ptr<ffrt::promise<uint32_t>> syncPromise = std::make_shared<ffrt::promise<uint32_t>>();
840     ffrt::future syncFuture = syncPromise->get_future();
841     actionHandler_->PostTask([this, syncPromise, callback]() {
842         HILOG_DEBUG();
843         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
844         if (!accountData) {
845             HILOG_ERROR("Account data is null");
846             syncPromise->set_value(ERR_INVALID_VALUE);
847             return;
848         }
849         if (!captionPropertyCallbackDeathRecipient_) {
850             captionPropertyCallbackDeathRecipient_ = new(std::nothrow) CaptionPropertyCallbackDeathRecipient();
851             if (!captionPropertyCallbackDeathRecipient_) {
852                 HILOG_ERROR("captionPropertyCallbackDeathRecipient_ is null");
853                 syncPromise->set_value(ERR_INVALID_VALUE);
854                 return;
855             }
856         }
857         if (!callback->AsObject()) {
858             HILOG_ERROR("object is null");
859             syncPromise->set_value(0);
860             return;
861         }
862         callback->AsObject()->AddDeathRecipient(captionPropertyCallbackDeathRecipient_);
863         accountData->AddCaptionPropertyCallback(callback);
864         HILOG_DEBUG("the size of caption property callbacks is %{public}zu",
865             accountData->GetCaptionPropertyCallbacks().size());
866         syncPromise->set_value(NO_ERROR);
867         }, "TASK_REGISTER_CAPTION_OBSERVER");
868 
869     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
870     if (wait != ffrt::future_status::ready) {
871         HILOG_ERROR("Failed to wait RegisterCaptionObserver result");
872         return RET_ERR_TIME_OUT;
873     }
874     return syncFuture.get();
875 }
876 
RegisterEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver> & observer)877 ErrCode AccessibleAbilityManagerService::RegisterEnableAbilityListsObserver(
878     const sptr<IAccessibilityEnableAbilityListsObserver> &observer)
879 {
880     HILOG_DEBUG();
881     if (!observer || !actionHandler_) {
882         HILOG_ERROR("Parameters check failed!");
883         return ERR_INVALID_DATA;
884     }
885     XCollieHelper timer(TIMER_REGISTER_ENABLEABILITY_OBSERVER, XCOLLIE_TIMEOUT);
886     std::shared_ptr<ffrt::promise<ErrCode>> syncPromisePtr = std::make_shared<ffrt::promise<ErrCode>>();
887     ffrt::future syncFuture = syncPromisePtr->get_future();
888     actionHandler_->PostTask([this, syncPromisePtr, observer]() {
889         HILOG_DEBUG();
890         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
891         if (!accountData) {
892             HILOG_ERROR("Account data is null");
893             syncPromisePtr->set_value(ERR_INVALID_DATA);
894             return;
895         }
896         if (!enableAbilityListsObserverDeathRecipient_) {
897             enableAbilityListsObserverDeathRecipient_ = new(std::nothrow) EnableAbilityListsObserverDeathRecipient();
898             if (!enableAbilityListsObserverDeathRecipient_) {
899                 HILOG_ERROR("enableAbilityListsObserverDeathRecipient_ is null");
900                 syncPromisePtr->set_value(ERR_INVALID_DATA);
901                 return;
902             }
903         }
904         if (!observer->AsObject()) {
905             HILOG_ERROR("object is null");
906             syncPromisePtr->set_value(ERR_OK);
907             return;
908         }
909         observer->AsObject()->AddDeathRecipient(enableAbilityListsObserverDeathRecipient_);
910         accountData->AddEnableAbilityListsObserver(observer);
911         syncPromisePtr->set_value(ERR_OK);
912         }, "TASK_REGISTER_ENABLE_ABILITY_LISTS_OBSERVER");
913 
914     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
915     if (wait != ffrt::future_status::ready) {
916         HILOG_ERROR("Failed to wait RegisterEnableAbilityListsObserver result");
917         return ERR_TRANSACTION_FAILED;
918     }
919     return syncFuture.get();
920 }
921 
GetAbilityList(uint32_t abilityTypes,int32_t stateType,std::vector<AccessibilityAbilityInfoParcel> & infos)922 ErrCode AccessibleAbilityManagerService::GetAbilityList(uint32_t abilityTypes, int32_t stateType,
923     std::vector<AccessibilityAbilityInfoParcel>& infos)
924 {
925     HILOG_DEBUG("abilityTypes(%{public}d) stateType(%{public}d)", abilityTypes, stateType);
926     if (!handler_ || (stateType > ABILITY_STATE_INSTALLED) || (stateType < ABILITY_STATE_ENABLE)) {
927         HILOG_ERROR("Parameters check failed! stateType:%{public}d", stateType);
928         return RET_ERR_INVALID_PARAM;
929     }
930 
931     ffrt::promise<RetError> syncPromise;
932     ffrt::future syncFuture = syncPromise.get_future();
933     handler_->PostTask([this, &syncPromise, &infos, abilityTypes, stateType]() {
934         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
935         if (!accountData) {
936             HILOG_ERROR("Get current account data failed!!");
937             syncPromise.set_value(RET_ERR_FAILED);
938             return;
939         }
940 
941         vector<AccessibilityAbilityInfo> abilities;
942         accountData->GetAbilitiesByState(static_cast<AbilityStateType>(stateType), abilities);
943         HILOG_DEBUG("abilityes count is %{public}zu", abilities.size());
944         for (auto &ability : abilities) {
945             if (abilityTypes == AccessibilityAbilityTypes::ACCESSIBILITY_ABILITY_TYPE_ALL ||
946                 (ability.GetAccessibilityAbilityType() & abilityTypes)) {
947                 AccessibilityAbilityInfoParcel info(ability);
948                 infos.push_back(info);
949             }
950         }
951         HILOG_DEBUG("infos count is %{public}zu", infos.size());
952         syncPromise.set_value(RET_OK);
953         }, "TASK_GET_ABILITY_LIST");
954     return syncFuture.get();
955 }
956 
IsApp() const957 bool AccessibleAbilityManagerService::IsApp() const
958 {
959     HILOG_DEBUG();
960 
961     AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
962     ATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(callerToken);
963     if (tokenType == TOKEN_HAP) {
964         HILOG_DEBUG("caller is an application");
965         return true;
966     }
967     return false;
968 }
969 
RegisterElementOperatorByWindowId(const int32_t windowId,const sptr<IAccessibilityElementOperator> & elementOperator)970 ErrCode AccessibleAbilityManagerService::RegisterElementOperatorByWindowId(
971     const int32_t windowId, const sptr<IAccessibilityElementOperator> &elementOperator)
972 {
973     if (!handler_) {
974         HILOG_ERROR("handler_ is nullptr.");
975         return RET_ERR_NULLPTR;
976     }
977     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
978     if (CheckCallingUid() != RET_OK) {
979         return RET_ERR_SAMGR;
980     }
981     bool isApp = IsApp();
982     handler_->PostTask([=]() {
983         HILOG_INFO("Register windowId[%{public}d]", windowId);
984         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
985         if (!accountData) {
986             HILOG_ERROR("Get current account data failed!!");
987             return;
988         }
989         sptr<AccessibilityWindowConnection> oldConnection = accountData->GetAccessibilityWindowConnection(windowId);
990         if (isApp && oldConnection) {
991             HILOG_WARN("no need to register again.");
992             return;
993         }
994         DeleteConnectionAndDeathRecipient(windowId, oldConnection);
995         sptr<AccessibilityWindowConnection> connection =
996             new(std::nothrow) AccessibilityWindowConnection(windowId, elementOperator, currentAccountId_);
997         if (!connection) {
998             Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
999                 A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1000             HILOG_ERROR("New  AccessibilityWindowConnection failed!!");
1001             return;
1002         }
1003         connection->SetTokenIdMap(SINGLE_TREE_ID, tokenId);
1004         accountData->AddAccessibilityWindowConnection(windowId, connection);
1005 
1006         IsCheckWindowIdEventExist(windowId);
1007         if (elementOperator && elementOperator->AsObject()) {
1008             sptr<IRemoteObject::DeathRecipient> deathRecipient =
1009                 new(std::nothrow) InteractionOperationDeathRecipient(windowId, currentAccountId_);
1010             if (!deathRecipient) {
1011                 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1012                     A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1013                 HILOG_ERROR("Create interactionOperationDeathRecipient failed");
1014                 return;
1015             }
1016 
1017             bool result = elementOperator->AsObject()->AddDeathRecipient(deathRecipient);
1018             interactionOperationDeathRecipients_[windowId] = deathRecipient;
1019             HILOG_DEBUG("The result of adding elementOperator's death recipient is %{public}d", result);
1020         }
1021         }, "TASK_REGISTER_ELEMENT_OPERATOR");
1022     return RET_OK;
1023 }
1024 
IsCheckWindowIdEventExist(const int32_t windowId)1025 void AccessibleAbilityManagerService::IsCheckWindowIdEventExist(const int32_t windowId)
1026 {
1027     if (CheckWindowIdEventExist(windowId)) {
1028         AccessibilityEventInfoParcel eventInfoParcel(windowFocusEventMap_.ReadVal(windowId));
1029         SendEvent(eventInfoParcel, 0);
1030         windowFocusEventMap_.Erase(windowId);
1031     }
1032 }
1033 
RegisterElementOperatorChildWork(const RegistrationPara & parameter,const int32_t treeId,const int64_t nodeId,const sptr<IAccessibilityElementOperator> & operation,const uint32_t tokenId,bool isApp)1034 RetError AccessibleAbilityManagerService::RegisterElementOperatorChildWork(const RegistrationPara &parameter,
1035     const int32_t treeId, const int64_t nodeId, const sptr<IAccessibilityElementOperator> &operation,
1036     const uint32_t tokenId, bool isApp)
1037 {
1038     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1039     if (accountData == nullptr) {
1040         Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1041             A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1042         HILOG_ERROR("Get current account data failed!!");
1043         return RET_ERR_REGISTER_EXIST;
1044     }
1045 
1046     sptr<AccessibilityWindowConnection> parentConnection =
1047         accountData->GetAccessibilityWindowConnection(parameter.parentWindowId);
1048     if (isApp && parentConnection) {
1049         sptr<IAccessibilityElementOperator> parentAamsOper =
1050             parentConnection->GetCardProxy(parameter.parentTreeId);
1051         if (parentAamsOper != nullptr) {
1052             parentAamsOper->SetChildTreeIdAndWinId(nodeId, treeId, parameter.windowId);
1053         } else {
1054             HILOG_DEBUG("parentAamsOper is nullptr");
1055         }
1056 
1057         auto cardOper = parentConnection->GetCardProxy(treeId);
1058         if (cardOper == nullptr) {
1059             parentConnection->SetCardProxy(treeId, operation);
1060             SetTokenIdMapAndRootParentId(parentConnection, treeId, nodeId, tokenId);
1061         }
1062     } else {
1063         return RET_ERR_NO_CONNECTION;
1064     }
1065 
1066     operation->SetBelongTreeId(treeId);
1067     operation->SetParentWindowId(parameter.parentWindowId);
1068     sptr<AccessibilityWindowConnection> oldConnection =
1069         accountData->GetAccessibilityWindowConnection(parameter.windowId);
1070     if (isApp && oldConnection) {
1071         if (oldConnection->GetCardProxy(treeId) != nullptr) {
1072             HILOG_WARN("no need to register again.");
1073             return RET_ERR_REGISTER_EXIST;
1074         } else {
1075             oldConnection->SetCardProxy(treeId, operation);
1076             SetTokenIdMapAndRootParentId(oldConnection, treeId, nodeId, tokenId);
1077         }
1078     }
1079     return RET_OK;
1080 }
1081 
SetTokenIdMapAndRootParentId(const sptr<AccessibilityWindowConnection> connection,const int32_t treeId,const int64_t nodeId,const uint32_t tokenId)1082 void AccessibleAbilityManagerService::SetTokenIdMapAndRootParentId(
1083     const sptr<AccessibilityWindowConnection> connection,
1084     const int32_t treeId, const int64_t nodeId, const uint32_t tokenId)
1085 {
1086     connection->SetTokenIdMap(treeId, tokenId);
1087     connection->SetRootParentId(treeId, nodeId);
1088 }
1089 
ApplyTreeId()1090 int32_t AccessibleAbilityManagerService::ApplyTreeId()
1091 {
1092     std::lock_guard<ffrt::mutex> lock(treeIdPoolMutex_);
1093     int32_t curTreeId = preTreeId_ + 1;
1094     for (int32_t index = 0; index < TREE_ID_MAX; index++) {
1095         if (curTreeId == TREE_ID_MAX) {
1096             curTreeId = 0;
1097         }
1098         if (!treeIdPool_.test(curTreeId)) {
1099             treeIdPool_.set(curTreeId, true);
1100             preTreeId_ = curTreeId;
1101             return curTreeId + 1;
1102         }
1103         curTreeId++;
1104     }
1105     preTreeId_ = TREE_ID_MAX - 1;
1106     return 0;
1107 }
1108 
RecycleTreeId(int32_t treeId)1109 void AccessibleAbilityManagerService::RecycleTreeId(int32_t treeId)
1110 {
1111     std::lock_guard<ffrt::mutex> lock(treeIdPoolMutex_);
1112     if ((treeId > 0) && (treeId <= TREE_ID_MAX)) {
1113         treeIdPool_.set(treeId - 1, false);
1114     }
1115 }
1116 
RegisterElementOperatorByParameter(const RegistrationPara & parameter,const sptr<IAccessibilityElementOperator> & elementOperator)1117 ErrCode AccessibleAbilityManagerService::RegisterElementOperatorByParameter(const RegistrationPara& parameter,
1118     const sptr<IAccessibilityElementOperator>& elementOperator)
1119 {
1120     if (CheckCallingUid() != RET_OK) {
1121         return RET_ERR_SAMGR;
1122     }
1123     int32_t treeIdSingle = ApplyTreeId();
1124     if (treeIdSingle == 0) {
1125         HILOG_ERROR("TreeId is used up.");
1126         return RET_ERR_TREE_TOO_BIG;
1127     }
1128     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
1129     int64_t nodeId = parameter.elementId;
1130     HILOG_INFO("get treeId element and treeid - treeId: %{public}d parameter.elementId[%{public}" PRId64 "]"
1131         "element[%{public}" PRId64 "]", treeIdSingle, parameter.elementId, nodeId);
1132 
1133     if (!handler_) {
1134         HILOG_ERROR("handler_ is nullptr.");
1135         return RET_ERR_NULLPTR;
1136     }
1137     bool isApp = IsApp();
1138     handler_->PostTask([=]() {
1139         HILOG_INFO("Register windowId[%{public}d]", parameter.windowId);
1140 #ifdef OHOS_BUILD_ENABLE_HITRACE
1141         HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "RegisterElementOperator");
1142 #endif // OHOS_BUILD_ENABLE_HITRACE
1143         if (RET_OK != RegisterElementOperatorChildWork(parameter, treeIdSingle, nodeId, elementOperator,
1144             tokenId, isApp)) {
1145             return;
1146         }
1147         if (CheckWindowIdEventExist(parameter.windowId)) {
1148             AccessibilityEventInfoParcel eventInfoParcel(windowFocusEventMap_.ReadVal(parameter.windowId));
1149             SendEvent(eventInfoParcel, 0);
1150             windowFocusEventMap_.Erase(parameter.windowId);
1151         }
1152         if (elementOperator && elementOperator->AsObject()) {
1153             sptr<IRemoteObject::DeathRecipient> deathRecipient =
1154                 new(std::nothrow) InteractionOperationDeathRecipient(parameter.windowId, treeIdSingle,
1155                     currentAccountId_);
1156             if (deathRecipient == nullptr) {
1157                 Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1158                     A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1159                 HILOG_ERROR("Create interactionOperationDeathRecipient failed");
1160                 return;
1161             }
1162             bool result = elementOperator->AsObject()->AddDeathRecipient(deathRecipient);
1163             interactionOperationDeathMap_[parameter.windowId][treeIdSingle] = deathRecipient;
1164             HILOG_DEBUG("The result of adding elementOperator's death recipient is %{public}d", result);
1165         }
1166         }, "TASK_REGISTER_ELEMENT_OPERATOR");
1167     return RET_OK;
1168 }
1169 
DeleteConnectionAndDeathRecipient(const int32_t windowId,const sptr<AccessibilityWindowConnection> & connection)1170 void AccessibleAbilityManagerService::DeleteConnectionAndDeathRecipient(
1171     const int32_t windowId, const sptr<AccessibilityWindowConnection> &connection)
1172 {
1173     HILOG_DEBUG();
1174     if (!connection) {
1175         HILOG_ERROR("connection is nullptr");
1176         return;
1177     }
1178 
1179     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1180     if (!accountData) {
1181         Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1182             A11yError::ERROR_CONNECT_TARGET_APPLICATION_FAILED);
1183         HILOG_ERROR("Get current account data failed!!");
1184         return;
1185     }
1186 
1187     accountData->RemoveAccessibilityWindowConnection(windowId);
1188     if (!connection->GetProxy()) {
1189         HILOG_WARN("proxy is null");
1190         return;
1191     }
1192     auto object = connection->GetProxy()->AsObject();
1193     if (object) {
1194         auto iter = interactionOperationDeathRecipients_.find(windowId);
1195         if (iter != interactionOperationDeathRecipients_.end()) {
1196             sptr<IRemoteObject::DeathRecipient> deathRecipient = iter->second;
1197             bool result = object->RemoveDeathRecipient(deathRecipient);
1198             HILOG_DEBUG("The result of deleting connection's death recipient is %{public}d", result);
1199             interactionOperationDeathRecipients_.erase(iter);
1200         }
1201     }
1202 }
1203 
DeregisterElementOperatorByWindowId(int32_t windowId)1204 ErrCode AccessibleAbilityManagerService::DeregisterElementOperatorByWindowId(int32_t windowId)
1205 {
1206     if (!handler_) {
1207         HILOG_ERROR("handler_ is nullptr.");
1208         return RET_ERR_NULLPTR;
1209     }
1210 
1211     handler_->PostTask([=]() {
1212         HILOG_INFO("Deregister windowId[%{public}d]", windowId);
1213         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1214         if (!accountData) {
1215             HILOG_ERROR("accountData is nullptr.");
1216             return;
1217         }
1218         sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
1219         if (!connection) {
1220             HILOG_WARN("The operation of windowId[%{public}d] has not been registered.", windowId);
1221             return;
1222         }
1223         StopCallbackWait(windowId);
1224 
1225         if (!connection->GetProxy()) {
1226             HILOG_ERROR("proxy is null");
1227             return;
1228         }
1229 
1230         auto object = connection->GetProxy()->AsObject();
1231         if (object) {
1232             auto iter = interactionOperationDeathRecipients_.find(windowId);
1233             if (iter != interactionOperationDeathRecipients_.end()) {
1234                 HILOG_DEBUG("delete death recipient, window id = %{public}d", windowId);
1235                 sptr<IRemoteObject::DeathRecipient> deathRecipient = iter->second;
1236                 bool result = object->RemoveDeathRecipient(deathRecipient);
1237                 HILOG_DEBUG("The result of deleting operation's death recipient is %{public}d", result);
1238                 interactionOperationDeathRecipients_.erase(iter);
1239             } else {
1240                 HILOG_INFO("cannot find remote object. windowId[%{public}d]", windowId);
1241             }
1242         }
1243 
1244         connection->SetProxy(nullptr);
1245         RemoveTreeDeathRecipient(windowId, 0, connection);
1246 
1247         std::vector<int32_t> treeIds {};
1248         connection->GetAllTreeId(treeIds);
1249         for (int32_t treeId : treeIds) {
1250             RecycleTreeId(treeId);
1251             StopCallbackWait(windowId, treeId);
1252             RemoveTreeDeathRecipient(windowId, treeId, connection);
1253         }
1254         accountData->RemoveAccessibilityWindowConnection(windowId);
1255         }, "TASK_DEREGISTER_ELEMENT_OPERATOR");
1256     return RET_OK;
1257 }
1258 
DeregisterElementOperatorByWindowIdAndTreeId(int32_t windowId,const int32_t treeId)1259 ErrCode AccessibleAbilityManagerService::DeregisterElementOperatorByWindowIdAndTreeId(int32_t windowId,
1260     const int32_t treeId)
1261 {
1262     if (!handler_) {
1263         HILOG_ERROR("handler_ is nullptr.");
1264         return RET_ERR_NULLPTR;
1265     }
1266 
1267     handler_->PostTask([=]() {
1268         HILOG_INFO("Deregister windowId[%{public}d], treeId[%{public}d] start", windowId, treeId);
1269         RecycleTreeId(treeId);
1270         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1271         if (!accountData) {
1272             HILOG_ERROR("accountData is nullptr.");
1273             return;
1274         }
1275         sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
1276         if (connection == nullptr) {
1277             HILOG_WARN("The operation of windowId[%{public}d] has not been registered.", windowId);
1278             return;
1279         }
1280         StopCallbackWait(windowId, treeId);
1281 
1282         RemoveTreeDeathRecipient(windowId, treeId, connection);
1283         // remove connection when all proxy and children tree proxy deregistered
1284         if (connection->GetProxy() == nullptr && connection->GetCardProxySize() == 0) {
1285             accountData->RemoveAccessibilityWindowConnection(windowId);
1286         }
1287         Singleton<AccessibilityWindowManager>::GetInstance().RemoveTreeIdWindowIdPair(treeId);
1288         }, "TASK_DEREGISTER_ELEMENT_OPERATOR");
1289     return RET_OK;
1290 }
1291 
RemoveTreeDeathRecipient(const int32_t windowId,const int32_t treeId,const sptr<AccessibilityWindowConnection> connection)1292 void AccessibleAbilityManagerService::RemoveTreeDeathRecipient(const int32_t windowId, const int32_t treeId,
1293     const sptr<AccessibilityWindowConnection> connection)
1294 {
1295     auto object = connection->GetCardProxy(treeId);
1296     if (object == nullptr) {
1297         HILOG_ERROR("GetCardProxy is null");
1298         return;
1299     }
1300     auto remoteObject = object->AsObject();
1301     connection->EraseProxy(treeId);
1302     auto iter = interactionOperationDeathMap_.find(windowId);
1303     if (iter != interactionOperationDeathMap_.end()) {
1304         auto iterTree = iter->second.find(treeId);
1305         if (iterTree != iter->second.end()) {
1306             sptr<IRemoteObject::DeathRecipient> deathRecipient = iterTree->second;
1307             bool result = remoteObject->RemoveDeathRecipient(deathRecipient);
1308             HILOG_DEBUG("The result of deleting operation's death recipient is %{public}d", result);
1309             iter->second.erase(iterTree);
1310         } else {
1311             HILOG_ERROR("cannot find remote object. treeId[%{public}d]", treeId);
1312         }
1313     } else {
1314         HILOG_ERROR("cannot find remote object. windowId[%{public}d]", windowId);
1315     }
1316 }
1317 
IsSystemApp() const1318 bool AccessibleAbilityManagerService::IsSystemApp() const
1319 {
1320     HILOG_DEBUG();
1321 
1322     AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1323     ATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(callerToken);
1324     if (tokenType != TOKEN_HAP) {
1325         HILOG_INFO("Caller is not a application.");
1326         return true;
1327     }
1328     uint64_t accessTokenId = IPCSkeleton::GetCallingFullTokenID();
1329     bool isSystemApplication = TokenIdKit::IsSystemAppByFullTokenID(accessTokenId);
1330     return isSystemApplication;
1331 }
1332 
CheckPermission(const std::string & permission) const1333 bool AccessibleAbilityManagerService::CheckPermission(const std::string &permission) const
1334 {
1335     HILOG_DEBUG();
1336     uint32_t callerToken = IPCSkeleton::GetCallingTokenID();
1337     int result = TypePermissionState::PERMISSION_GRANTED;
1338     ATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(callerToken);
1339     if (tokenType == TOKEN_INVALID) {
1340         HILOG_WARN("AccessToken type invalid!");
1341         return false;
1342     } else {
1343         result = AccessTokenKit::VerifyAccessToken(callerToken, permission);
1344     }
1345     if (result == TypePermissionState::PERMISSION_DENIED) {
1346         HILOG_WARN("AccessTokenID denied!");
1347         return false;
1348     }
1349     HILOG_DEBUG("tokenType %{private}d dAccessTokenID:%{private}u, permission:%{private}s matched!",
1350         tokenType, callerToken, permission.c_str());
1351     return true;
1352 }
1353 
GetCaptionProperty(CaptionPropertyParcel & caption)1354 ErrCode AccessibleAbilityManagerService::GetCaptionProperty(CaptionPropertyParcel &caption)
1355 {
1356     if (!IsSystemApp()) {
1357         HILOG_WARN("Not system app");
1358         return RET_ERR_NOT_SYSTEM_APP;
1359     }
1360     return accessibilitySettings_->GetCaptionProperty(caption);
1361 }
1362 
SetCaptionProperty(const CaptionPropertyParcel & caption)1363 ErrCode AccessibleAbilityManagerService::SetCaptionProperty(const CaptionPropertyParcel &caption)
1364 {
1365     if (!IsSystemApp()) {
1366         HILOG_WARN("Not system app");
1367         return RET_ERR_NOT_SYSTEM_APP;
1368     }
1369     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
1370         HILOG_WARN("SetCaptionProperty permission denied.");
1371         return RET_ERR_NO_PERMISSION;
1372     }
1373     return accessibilitySettings_->SetCaptionProperty(caption);
1374 }
1375 
SetCaptionState(const bool state)1376 ErrCode AccessibleAbilityManagerService::SetCaptionState(const bool state)
1377 {
1378     if (!IsSystemApp()) {
1379         HILOG_WARN("Not system app");
1380         return RET_ERR_NOT_SYSTEM_APP;
1381     }
1382     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
1383         HILOG_WARN("SetCaptionProperty permission denied.");
1384         return RET_ERR_NO_PERMISSION;
1385     }
1386     return accessibilitySettings_->SetCaptionState(state);
1387 }
1388 
GetCaptionState(bool & state)1389 ErrCode AccessibleAbilityManagerService::GetCaptionState(bool &state)
1390 {
1391     if (!IsSystemApp()) {
1392         HILOG_WARN("Not system app");
1393         return RET_ERR_NOT_SYSTEM_APP;
1394     }
1395     return accessibilitySettings_->GetCaptionState(state);
1396 }
1397 
EnableAbility(const std::string & name,const uint32_t capabilities)1398 ErrCode AccessibleAbilityManagerService::EnableAbility(const std::string &name, const uint32_t capabilities)
1399 {
1400     HILOG_DEBUG();
1401     if (!IsSystemApp()) {
1402         HILOG_WARN("Not system app");
1403         return RET_ERR_NOT_SYSTEM_APP;
1404     }
1405     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
1406         HILOG_WARN("SetCaptionProperty permission denied.");
1407         return RET_ERR_NO_PERMISSION;
1408     }
1409     if (!handler_) {
1410         HILOG_ERROR("handler_ is nullptr.");
1411         return RET_ERR_NULLPTR;
1412     }
1413 
1414     ffrt::promise<RetError> syncPromise;
1415     ffrt::future syncFuture = syncPromise.get_future();
1416     handler_->PostTask([this, &syncPromise, &name, &capabilities]() {
1417         HILOG_DEBUG();
1418         RetError result = InnerEnableAbility(name, capabilities);
1419         syncPromise.set_value(result);
1420         }, "TASK_ENABLE_ABILITIES");
1421     return syncFuture.get();
1422 }
1423 
SetHighContrastTextAbility(bool state)1424 bool AccessibleAbilityManagerService::SetHighContrastTextAbility(bool state)
1425 {
1426     HILOG_DEBUG();
1427     Utils::RecordEnableShortkeyAbilityEvent("HIGH_CONTRAST_TEXT", !state);
1428     RetError result = accessibilitySettings_->SetHighContrastTextState(!state);
1429     if (result != RET_OK) {
1430         return false;
1431     }
1432     if (state == true) {
1433         return true;
1434     }
1435 
1436     int32_t accountId = Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountId();
1437     if (!Utils::UpdateColorModeConfiguration(accountId)) {
1438         return false;
1439     }
1440     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1441     if (!accountData) {
1442         HILOG_ERROR("accountData is nullptr");
1443         return false;
1444     }
1445     accountData->GetConfig()->SetColorModeState(A11yDarkModeType::DEFAULT_DARK_MODE_STATE);
1446     return true;
1447 }
1448 
SetTargetAbility(const int32_t targetAbilityValue)1449 bool AccessibleAbilityManagerService::SetTargetAbility(const int32_t targetAbilityValue)
1450 {
1451     HILOG_DEBUG();
1452 
1453     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1454     if (!accountData) {
1455         HILOG_ERROR("accountData is nullptr");
1456         return false;
1457     }
1458 
1459     bool state;
1460     switch (targetAbilityValue) {
1461         case HIGH_CONTRAST_TEXT:
1462             state = accountData->GetConfig()->GetHighContrastTextState();
1463             return SetHighContrastTextAbility(state);
1464         case INVERT_COLOR:
1465             state = accountData->GetConfig()->GetInvertColorState();
1466             Utils::RecordEnableShortkeyAbilityEvent("INVERT_COLOR", !state);
1467             return accessibilitySettings_->SetInvertColorState(!state) == RET_OK;
1468         case ANIMATION_OFF:
1469             state = accountData->GetConfig()->GetAnimationOffState();
1470             Utils::RecordEnableShortkeyAbilityEvent("ANIMATION_OFF", !state);
1471             return accessibilitySettings_->SetAnimationOffState(!state) == RET_OK;
1472         case SCREEN_MAGNIFICATION:
1473             state = accountData->GetConfig()->GetScreenMagnificationState();
1474             Utils::RecordEnableShortkeyAbilityEvent("SCREEN_MAGNIFICATION", !state);
1475             return accessibilitySettings_->SetScreenMagnificationState(!state) == RET_OK;
1476         case AUDIO_MONO:
1477             state = accountData->GetConfig()->GetAudioMonoState();
1478             Utils::RecordEnableShortkeyAbilityEvent("AUDIO_MONO", !state);
1479             return accessibilitySettings_->SetAudioMonoState(!state) == RET_OK;
1480         case MOUSE_KEY:
1481             state = accountData->GetConfig()->GetMouseKeyState();
1482             Utils::RecordEnableShortkeyAbilityEvent("MOUSE_KEY", !state);
1483             return accessibilitySettings_->SetMouseKeyState(!state) == RET_OK;
1484         case CAPTION_STATE:
1485             state = accountData->GetConfig()->GetCaptionState();
1486             Utils::RecordEnableShortkeyAbilityEvent("CAPTION_STATE", !state);
1487             return accessibilitySettings_->SetCaptionState(!state) == RET_OK;
1488         default:
1489             return false;
1490     }
1491 }
1492 
GetScreenReaderState(bool & state)1493 ErrCode AccessibleAbilityManagerService::GetScreenReaderState(bool &state)
1494 {
1495     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1496     if (!accountData) {
1497         HILOG_ERROR("accountData is nullptr");
1498         return ERR_INVALID_DATA;
1499     }
1500     state = accountData->GetScreenReaderState();
1501     return ERR_OK;
1502 }
1503 
InnerEnableAbility(const std::string & name,const uint32_t capabilities)1504 RetError AccessibleAbilityManagerService::InnerEnableAbility(const std::string &name, const uint32_t capabilities)
1505 {
1506     HILOG_DEBUG();
1507     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1508     if (!accountData) {
1509         HILOG_ERROR("accountData is nullptr");
1510         return RET_ERR_NULLPTR;
1511     }
1512     auto iter = removedAutoStartAbilities_.begin();
1513     for (; iter != removedAutoStartAbilities_.end(); ++iter) {
1514         if (*iter == name) {
1515             removedAutoStartAbilities_.erase(iter);
1516             break;
1517         }
1518     }
1519     return accountData->EnableAbility(name, capabilities);
1520 }
1521 
GetEnabledAbilities(std::vector<std::string> & enabledAbilities)1522 ErrCode AccessibleAbilityManagerService::GetEnabledAbilities(std::vector<std::string> &enabledAbilities)
1523 {
1524     HILOG_DEBUG();
1525     if (!handler_) {
1526         HILOG_ERROR("handler_ is nullptr.");
1527         return RET_ERR_NULLPTR;
1528     }
1529 
1530     ffrt::promise<RetError> syncPromise;
1531     ffrt::future syncFuture = syncPromise.get_future();
1532     handler_->PostTask([this, &syncPromise, &enabledAbilities]() {
1533         HILOG_DEBUG();
1534         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1535         if (!accountData) {
1536             HILOG_ERROR("accountData is nullptr");
1537             syncPromise.set_value(RET_ERR_NULLPTR);
1538             return;
1539         }
1540         enabledAbilities = accountData->GetEnabledAbilities();
1541         syncPromise.set_value(RET_OK);
1542         }, "TASK_GET_ENABLE_ABILITIES");
1543     return syncFuture.get();
1544 }
1545 
SetCurtainScreenUsingStatus(bool isEnable)1546 RetError AccessibleAbilityManagerService::SetCurtainScreenUsingStatus(bool isEnable)
1547 {
1548     HILOG_DEBUG();
1549     auto rsInterfaces = &(Rosen::RSInterfaces::GetInstance());
1550     if (rsInterfaces == nullptr) {
1551         HILOG_ERROR("rsInterfaces is nullptr.");
1552         return RET_ERR_NULLPTR;
1553     }
1554     HILOG_INFO("SetCurtainScreenUsingStatus: status = %{public}d", isEnable);
1555     rsInterfaces->SetCurtainScreenUsingStatus(isEnable);
1556     return RET_OK;
1557 }
1558 
DisableAbility(const std::string & name)1559 ErrCode AccessibleAbilityManagerService::DisableAbility(const std::string &name)
1560 {
1561     HILOG_INFO();
1562     if (!IsSystemApp()) {
1563         HILOG_WARN("Not system app");
1564         return RET_ERR_NOT_SYSTEM_APP;
1565     }
1566     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
1567         HILOG_WARN("SetCaptionProperty permission denied.");
1568         return RET_ERR_NO_PERMISSION;
1569     }
1570     if (!handler_) {
1571         HILOG_ERROR("handler_ is nullptr.");
1572         return RET_ERR_NULLPTR;
1573     }
1574 
1575 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
1576     std::string bundleName = "";
1577     bundleName = Utils::GetBundleNameFromUri(name);
1578     auto &powerManager = Singleton<AccessibilityPowerManager>::GetInstance();
1579     if (!powerManager.UnholdRunningLock(bundleName)) {
1580         HILOG_ERROR("Failed to unhold running lock.");
1581         return RET_ERR_FAILED;
1582     }
1583 #endif
1584     ffrt::promise<RetError> syncPromise;
1585     ffrt::future syncFuture = syncPromise.get_future();
1586     handler_->PostTask([this, &syncPromise, &name]() {
1587         HILOG_DEBUG();
1588         RetError result = InnerDisableAbility(name);
1589         syncPromise.set_value(result);
1590         }, "TASK_DISABLE_ABILITIES");
1591     return syncFuture.get();
1592 }
1593 
InnerDisableAbility(const std::string & name)1594 RetError AccessibleAbilityManagerService::InnerDisableAbility(const std::string &name)
1595 {
1596     HILOG_INFO();
1597 #ifdef OHOS_BUILD_ENABLE_HITRACE
1598     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "InnerDisableAbility:" + name);
1599 #endif // OHOS_BUILD_ENABLE_HITRACE
1600 
1601     if (!actionHandler_) {
1602         HILOG_ERROR("actionHandler_ is nullptr.");
1603         return RET_ERR_NULLPTR;
1604     }
1605 
1606     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1607     if (!accountData) {
1608         HILOG_ERROR("accountData is nullptr");
1609         return RET_ERR_NULLPTR;
1610     }
1611     if (accountData->GetConnectingA11yAbility(name) != nullptr) {
1612         HILOG_WARN("refuse to disconnect ability %{public}s when connecting", name.c_str());
1613         return RET_OK;
1614     }
1615     if (name == SCREEN_READER_BUNDLE_ABILITY_NAME) {
1616         actionHandler_->PostTask([this]() {
1617             ExecuteActionOnAccessibilityFocused(ACCESSIBILITY_ACTION_CLEAR_ACCESSIBILITY_FOCUS);
1618             }, "TASK_CLEAR_FOCUS");
1619         SetCurtainScreenUsingStatus(false);
1620     }
1621     RetError ret = accountData->RemoveEnabledAbility(name);
1622     if (ret != RET_OK) {
1623         HILOG_ERROR("RemoveEnabledAbility failed");
1624         return ret;
1625     }
1626 
1627     accountData->SetAbilityAutoStartState(name, false);
1628     accountData->RemoveConnectingA11yAbility(name);
1629     accountData->UpdateAbilities();
1630     return RET_OK;
1631 }
1632 
SetMagnificationState(const bool state)1633 ErrCode AccessibleAbilityManagerService::SetMagnificationState(const bool state)
1634 {
1635     HILOG_INFO("state = %{public}d", state);
1636     bool currentState = GetMagnificationState();
1637     uint32_t type = GetMagnificationType();
1638     uint32_t mode = GetMagnificationMode();
1639     if (!system::GetBoolParameter(MAGNIFICATION_PARAM, false)) {
1640         HILOG_WARN("Not support magnification");
1641         return RET_ERR_MAGNIFICATION_NOT_SUPPORT;
1642     }
1643     if (!IsSystemApp()) {
1644         HILOG_WARN("Not system app");
1645         return RET_ERR_NOT_SYSTEM_APP;
1646     }
1647     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
1648         HILOG_WARN("SetCaptionProperty permission denied.");
1649         return RET_ERR_NO_PERMISSION;
1650     }
1651 
1652     if (state && !currentState) {
1653         HILOG_ERROR("magnification is not enabled.");
1654         return RET_ERR_ENABLE_MAGNIFICATION;
1655     }
1656 
1657     if (magnificationManager_ == nullptr) {
1658         HILOG_ERROR("magnificationManager_ is nullptr.");
1659         return RET_ERR_ENABLE_MAGNIFICATION;
1660     }
1661 
1662     if (state == magnificationManager_->GetMagnificationState()) {
1663         HILOG_ERROR("no need change state.");
1664         return RET_OK;
1665     }
1666 
1667     if (state) {
1668         magnificationManager_->TriggerMagnification(type, mode);
1669     } else {
1670         magnificationManager_->DisableMagnification();
1671     }
1672     return RET_OK;
1673 }
1674 
CheckExtensionAbilityPermission(std::string & processName)1675 ErrCode AccessibleAbilityManagerService::CheckExtensionAbilityPermission(std::string& processName)
1676 {
1677     bool ret = Permission::CheckCallingPermission(OHOS_PERMISSION_ACCESSIBILITY_EXTENSION_ABILITY);
1678     auto id = IPCSkeleton::GetCallingTokenID();
1679     Security::AccessToken::NativeTokenInfo info;
1680     auto result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(id, info);
1681     if (result != 0) {
1682         HILOG_ERROR("get native token info failed!");
1683         return RET_ERR_TOKEN_ID;
1684     }
1685 
1686     processName = info.processName;
1687     if ((processName.compare("hdcd") != 0) && (!ret)) {
1688         HILOG_ERROR("permission check failed, processName = %{public}s", processName.c_str());
1689         return RET_ERR_NO_PERMISSION;
1690     }
1691 
1692     return RET_OK;
1693 }
1694 
EnableUITestAbility(const sptr<IRemoteObject> & obj)1695 ErrCode AccessibleAbilityManagerService::EnableUITestAbility(const sptr<IRemoteObject> &obj)
1696 {
1697     HILOG_DEBUG();
1698     if (!IsSystemApp()) {
1699         HILOG_WARN("Not system app");
1700         return RET_ERR_NOT_SYSTEM_APP;
1701     }
1702     if (!handler_) {
1703         HILOG_ERROR("handler_ is nullptr.");
1704         return RET_ERR_NULLPTR;
1705     }
1706 
1707     if (!obj) {
1708         HILOG_ERROR("obj is nullptr.");
1709         return RET_ERR_NULLPTR;
1710     }
1711 
1712     std::string processName = "";
1713     auto ret = CheckExtensionAbilityPermission(processName);
1714     if (ret != RET_OK) {
1715         return ret;
1716     }
1717 
1718     ffrt::promise<RetError> syncPromise;
1719     ffrt::future syncFuture = syncPromise.get_future();
1720     handler_->PostTask([this, &syncPromise, obj, processName]() {
1721         HILOG_DEBUG();
1722         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1723         if (!accountData) {
1724             HILOG_ERROR("accountData is nullptr");
1725             syncPromise.set_value(RET_ERR_NULLPTR);
1726             return;
1727         }
1728         std::string uiTestUri = Utils::GetUri(processName, processName);
1729         sptr<AccessibleAbilityConnection> connection = accountData->GetAccessibleAbilityConnection(uiTestUri);
1730         if (connection) {
1731             HILOG_ERROR("connection is existed!!");
1732             syncPromise.set_value(RET_ERR_CONNECTION_EXIST);
1733             return;
1734         }
1735 
1736         std::function<void()> addUITestClientFunc = std::bind(&AccessibilityAccountData::AddUITestClient, accountData,
1737             obj, processName, processName);
1738         handler_->PostTask(addUITestClientFunc, "AddUITestClient");
1739         accountData->AddEnabledAbility(uiTestUri);
1740         syncPromise.set_value(RET_OK);
1741         }, "TASK_ENABLE_UI_TEST_ABILITIES");
1742     return syncFuture.get();
1743 }
1744 
DisableUITestAbility()1745 ErrCode AccessibleAbilityManagerService::DisableUITestAbility()
1746 {
1747     HILOG_DEBUG();
1748     if (!IsSystemApp()) {
1749         HILOG_WARN("Not system app");
1750         return RET_ERR_NOT_SYSTEM_APP;
1751     }
1752     if (!handler_) {
1753         HILOG_ERROR("handler_ is nullptr.");
1754         return RET_ERR_NULLPTR;
1755     }
1756 
1757     std::string processName = "";
1758     auto ret = CheckExtensionAbilityPermission(processName);
1759     if (ret != RET_OK) {
1760         return ret;
1761     }
1762 
1763     std::shared_ptr<ffrt::promise<RetError>> syncPromise = std::make_shared<ffrt::promise<RetError>>();
1764     ffrt::future syncFuture = syncPromise->get_future();
1765     handler_->PostTask([this, syncPromise, processName]() {
1766         HILOG_DEBUG();
1767         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1768         if (!accountData) {
1769             HILOG_ERROR("accountData is nullptr");
1770             syncPromise->set_value(RET_ERR_NULLPTR);
1771             return;
1772         }
1773         std::string uiTestUri = Utils::GetUri(processName, processName);
1774         sptr<AccessibleAbilityConnection> connection = accountData->GetAccessibleAbilityConnection(uiTestUri);
1775         if (!connection) {
1776             HILOG_ERROR("connection is not existed!!");
1777             syncPromise->set_value(RET_ERR_NO_CONNECTION);
1778             return;
1779         }
1780         std::function<void()> removeUITestClientFunc =
1781             std::bind(&AccessibilityAccountData::RemoveUITestClient, accountData, connection, processName);
1782         handler_->PostTask(removeUITestClientFunc, "RemoveUITestClient");
1783         accountData->RemoveEnabledAbility(uiTestUri);
1784         syncPromise->set_value(RET_OK);
1785         }, "TASK_DISABLE_UI_TEST_ABILITIES");
1786 
1787     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
1788     if (wait != ffrt::future_status::ready) {
1789         HILOG_ERROR("Failed to wait DisableUITestAbility result");
1790         return RET_ERR_TIME_OUT;
1791     }
1792     return syncFuture.get();
1793 }
1794 
GetActiveWindow(int32_t & windowId)1795 ErrCode AccessibleAbilityManagerService::GetActiveWindow(int32_t &windowId)
1796 {
1797     HILOG_DEBUG();
1798     windowId = Singleton<AccessibilityWindowManager>::GetInstance().GetActiveWindowId();
1799     return ERR_OK;
1800 }
1801 
GetActiveWindow(int32_t & windowId,bool systemApi)1802 ErrCode AccessibleAbilityManagerService::GetActiveWindow(int32_t &windowId, bool systemApi)
1803 {
1804     if (systemApi && !CheckPermission(OHOS_PERMISSION_ACCESSIBILITY_EXTENSION_ABILITY)) {
1805         HILOG_WARN("GetActiveWindow permission denied.");
1806         return RET_ERR_NO_PERMISSION;
1807     }
1808     return GetActiveWindow(windowId);
1809 }
1810 
Init()1811 bool AccessibleAbilityManagerService::Init()
1812 {
1813     HILOG_DEBUG();
1814     Singleton<AccessibilityCommonEvent>::GetInstance().SubscriberEvent(handler_);
1815     Singleton<AccessibilityWindowManager>::GetInstance().RegisterWindowListener(handler_);
1816     bool result = Singleton<AccessibilityWindowManager>::GetInstance().Init();
1817     HILOG_DEBUG("wms init result is %{public}d", result);
1818 
1819     int32_t retry = QUERY_USER_ID_RETRY_COUNT;
1820     int32_t sleepTime = QUERY_USER_ID_SLEEP_TIME;
1821     std::vector<int32_t> accountIds;
1822     ErrCode ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountIds);
1823     while (ret != ERR_OK || accountIds.size() == 0) {
1824         HILOG_DEBUG("Query account information failed, left retry count:%{public}d", retry);
1825         if (retry == 0) {
1826             HILOG_ERROR("Query account information failed!!!");
1827             break;
1828         }
1829         std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime));
1830         ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountIds);
1831         retry--;
1832     }
1833 
1834     if (accountIds.size() > 0) {
1835         HILOG_DEBUG("Query account information success, account id:%{public}d", accountIds[0]);
1836         SwitchedUser(accountIds[0]);
1837     }
1838     return true;
1839 }
1840 
InitInnerResource()1841 void AccessibleAbilityManagerService::InitInnerResource()
1842 {
1843     UpdateSettingsInAtoHosTask();
1844 }
1845 
OnRemoteDied(const wptr<IRemoteObject> & remote)1846 void AccessibleAbilityManagerService::InteractionOperationDeathRecipient::OnRemoteDied(
1847     const wptr<IRemoteObject> &remote)
1848 {
1849     Utils::RecordUnavailableEvent(A11yUnavailableEvent::CONNECT_EVENT,
1850         A11yError::ERROR_TARGET_APPLICATION_DISCONNECT_ABNORMALLY);
1851     HILOG_INFO();
1852     sptr<AccessibilityAccountData> accountData =
1853         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
1854     if (accountData == nullptr) {
1855         HILOG_ERROR("get accountData failed");
1856         return;
1857     }
1858     int32_t currentAccountId = accountData->GetAccountId();
1859     if (currentAccountId != accountId_) {
1860         HILOG_ERROR("check accountId failed");
1861         return;
1862     }
1863 
1864     if (treeId_ > 0) {
1865         Singleton<AccessibleAbilityManagerService>::GetInstance().DeregisterElementOperatorByWindowIdAndTreeId(
1866             windowId_, treeId_);
1867     } else {
1868         Singleton<AccessibleAbilityManagerService>::GetInstance().DeregisterElementOperatorByWindowId(windowId_);
1869     }
1870 }
1871 
GetCurrentAccountData()1872 sptr<AccessibilityAccountData> AccessibleAbilityManagerService::GetCurrentAccountData()
1873 {
1874     HILOG_DEBUG();
1875     if (currentAccountId_ == -1) {
1876         HILOG_ERROR("current account id is wrong");
1877         return nullptr;
1878     }
1879 
1880     return a11yAccountsData_.GetCurrentAccountData(currentAccountId_);
1881 }
1882 
GetAccountData(int32_t accountId)1883 sptr<AccessibilityAccountData> AccessibleAbilityManagerService::GetAccountData(int32_t accountId)
1884 {
1885     HILOG_DEBUG();
1886     return a11yAccountsData_.GetAccountData(accountId);
1887 }
1888 
GetAllAccountIds()1889 std::vector<int32_t> AccessibleAbilityManagerService::GetAllAccountIds()
1890 {
1891     HILOG_DEBUG();
1892     return a11yAccountsData_.GetAllAccountIds();
1893 }
1894 
GetAccessibilityWindowConnection(int32_t windowId)1895 sptr<AccessibilityWindowConnection> AccessibleAbilityManagerService::GetAccessibilityWindowConnection(
1896     int32_t windowId)
1897 {
1898     HILOG_DEBUG("windowId(%{public}d)", windowId);
1899     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1900     if (!accountData) {
1901         HILOG_ERROR("Get account data failed");
1902         return nullptr;
1903     }
1904     return accountData->GetAccessibilityWindowConnection(windowId);
1905 }
1906 
ClearFocus(int32_t windowId)1907 void AccessibleAbilityManagerService::ClearFocus(int32_t windowId)
1908 {
1909     HILOG_DEBUG();
1910     sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
1911     if (connection && connection->GetProxy()) {
1912         connection->GetProxy()->ClearFocus();
1913     }
1914 }
1915 
OutsideTouch(int32_t windowId)1916 void AccessibleAbilityManagerService::OutsideTouch(int32_t windowId)
1917 {
1918     HILOG_DEBUG();
1919     sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
1920     if (connection && connection->GetProxy()) {
1921         connection->GetProxy()->OutsideTouch();
1922     }
1923 }
1924 
SetTouchEventInjector(const sptr<TouchEventInjector> & touchEventInjector)1925 void AccessibleAbilityManagerService::SetTouchEventInjector(const sptr<TouchEventInjector> &touchEventInjector)
1926 {
1927     HILOG_DEBUG();
1928     touchEventInjector_ = touchEventInjector;
1929 }
1930 
SetKeyEventFilter(const sptr<KeyEventFilter> & keyEventFilter)1931 void AccessibleAbilityManagerService::SetKeyEventFilter(const sptr<KeyEventFilter> &keyEventFilter)
1932 {
1933     HILOG_DEBUG();
1934     keyEventFilter_ = keyEventFilter;
1935 }
1936 
OnRemoteDied(const wptr<IRemoteObject> & remote)1937 void AccessibleAbilityManagerService::StateCallbackDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1938 {
1939     Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(STATE_CALLBACK, this, remote);
1940 }
1941 
OnRemoteDied(const wptr<IRemoteObject> & remote)1942 void AccessibleAbilityManagerService::CaptionPropertyCallbackDeathRecipient::OnRemoteDied(
1943     const wptr<IRemoteObject> &remote)
1944 {
1945     Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(CAPTION_PROPERTY_CALLBACK, this, remote);
1946 }
1947 
OnRemoteDied(const wptr<IRemoteObject> & remote)1948 void AccessibleAbilityManagerService::EnableAbilityListsObserverDeathRecipient::OnRemoteDied(
1949     const wptr<IRemoteObject> &remote)
1950 {
1951     Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(
1952         ENABLE_ABILITY_LISTS_CALLBACK, this, remote);
1953 }
1954 
AddedUser(int32_t accountId)1955 void AccessibleAbilityManagerService::AddedUser(int32_t accountId)
1956 {
1957     HILOG_DEBUG();
1958     a11yAccountsData_.AddAccountData(accountId);
1959 }
1960 
RemovedUser(int32_t accountId)1961 void AccessibleAbilityManagerService::RemovedUser(int32_t accountId)
1962 {
1963     HILOG_DEBUG();
1964     if (accountId == currentAccountId_) {
1965         HILOG_ERROR("Remove user failed, this account is current account.");
1966         return;
1967     }
1968 
1969     auto accountData = a11yAccountsData_.RemoveAccountData(accountId);
1970     if (accountData) {
1971         accountData->GetConfig()->ClearData();
1972         return;
1973     }
1974 
1975     HILOG_ERROR("accountId is not exist");
1976 }
1977 
SwitchedUser(int32_t accountId)1978 void AccessibleAbilityManagerService::SwitchedUser(int32_t accountId)
1979 {
1980     HILOG_DEBUG();
1981 
1982     if (accountId == currentAccountId_) {
1983         HILOG_WARN("The account is current account id.");
1984         return;
1985     }
1986 
1987     std::map<std::string, uint32_t> importantEnabledAbilities;
1988     SCREENREADER_STATE screenReaderState = SCREENREADER_STATE::UNINIT;
1989     if (currentAccountId_ != -1) {
1990         HILOG_DEBUG();
1991         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
1992         if (!accountData) {
1993             HILOG_ERROR("Current account data is null");
1994             return;
1995         }
1996         defaultConfigCallbacks_ = accountData->GetConfigCallbacks();
1997         screenReaderState = accountData->GetDefaultUserScreenReaderState() ?
1998             SCREENREADER_STATE::ON : SCREENREADER_STATE::OFF;
1999         if (screenReaderState == SCREENREADER_STATE::ON) {
2000             ExecuteActionOnAccessibilityFocused(ACCESSIBILITY_ACTION_CLEAR_ACCESSIBILITY_FOCUS);
2001         }
2002         accountData->GetImportantEnabledAbilities(importantEnabledAbilities);
2003         accountData->OnAccountSwitched();
2004         accountData->UpdateAccountCapabilities();
2005         if (inputInterceptor_ != nullptr) {
2006             inputInterceptor_->SetAvailableFunctions(0);
2007         }
2008         UpdateAccessibilityState();
2009         UpdateShortKeyRegister();
2010     }
2011     currentAccountId_ = accountId;
2012     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2013     if (!accountData) {
2014         HILOG_ERROR("accountData is nullptr.");
2015         return;
2016     }
2017     accountData->Init();
2018     accountData->SetConfigCallbacks(defaultConfigCallbacks_);
2019 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
2020     float discount = accountData->GetConfig()->GetBrightnessDiscount();
2021     if (!Singleton<AccessibilityPowerManager>::GetInstance().DiscountBrightness(discount)) {
2022         HILOG_ERROR("Failed to set brightness discount");
2023     }
2024 #endif
2025     AccountSA::OsAccountType accountType = accountData->GetAccountType();
2026     if (screenReaderState != SCREENREADER_STATE::UNINIT &&
2027         (accountType == AccountSA::OsAccountType::PRIVATE || accountType == AccountSA::OsAccountType::ADMIN)) {
2028         bool state = (screenReaderState == SCREENREADER_STATE::ON) ? true : false;
2029         bool ignoreRepeatClickState = accountData->GetConfig()->GetIgnoreRepeatClickState();
2030         if (ignoreRepeatClickState) {
2031             accountData->SetAbilityAutoStartState(SCREEN_READER_BUNDLE_ABILITY_NAME, false);
2032             HILOG_INFO("ignoreRepeatClickState is true, set screenreader false.");
2033         } else {
2034             accountData->SetAbilityAutoStartState(SCREEN_READER_BUNDLE_ABILITY_NAME, state);
2035             HILOG_INFO("set screenreader auto-start state = %{public}d", state);
2036         }
2037     }
2038 
2039     if (accountData->GetInstalledAbilitiesFromBMS()) {
2040         accountData->UpdateImportantEnabledAbilities(importantEnabledAbilities);
2041         accountData->UpdateAbilities();
2042         UpdateAccessibilityManagerService();
2043     }
2044     UpdateAllSetting();
2045     UpdateAutoStartAbilities();
2046     UpdateVoiceRecognitionState();
2047     RegisterShortKeyEvent();
2048     RegisterScreenMagnificationState();
2049     RegisterScreenMagnificationType();
2050     RegisterVoiceRecognitionState();
2051 }
2052 
PackageRemoved(const std::string & bundleName)2053 void AccessibleAbilityManagerService::PackageRemoved(const std::string &bundleName)
2054 {
2055     sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
2056     if (!packageAccount) {
2057         HILOG_ERROR("packageAccount is nullptr.");
2058         return;
2059     }
2060 
2061     packageAccount->DelAutoStartPrefKeyInRemovePkg(bundleName);
2062     std::vector<std::string> multiTarget = packageAccount->GetConfig()->GetShortkeyMultiTarget();
2063     std::string name = packageAccount->GetConfig()->GetShortkeyTarget();
2064     auto installedAbilities_ = packageAccount->GetInstalledAbilities();
2065     for (auto &installAbility : installedAbilities_) {
2066         std::string abilityId = installAbility.GetId();
2067         HILOG_DEBUG("abilityId%{public}s", abilityId.c_str());
2068         if (bundleName != installAbility.GetPackageName()) {
2069             continue;
2070         }
2071         if (std::find(removedAutoStartAbilities_.begin(), removedAutoStartAbilities_.end(), abilityId)
2072             == removedAutoStartAbilities_.end()) {
2073             removedAutoStartAbilities_.push_back(abilityId);
2074         }
2075         // no use later version
2076         if (abilityId == name) {
2077             std::string targetName = "";
2078             packageAccount->GetConfig()->SetShortkeyTarget(targetName);
2079             UpdateShortkeyTarget();
2080         }
2081         // multi
2082         for (const auto &target : multiTarget) {
2083             if (target == abilityId) {
2084                 packageAccount->GetConfig()->SetShortkeyMultiTargetInPkgRemove(abilityId);
2085                 UpdateShortkeyMultiTarget();
2086             }
2087         }
2088     }
2089 
2090     if (packageAccount->RemoveAbility(bundleName)) {
2091         HILOG_DEBUG("ability%{public}s removed!", bundleName.c_str());
2092         UpdateAccessibilityManagerService();
2093     }
2094 }
2095 
PackageAdd(const std::string & bundleName)2096 void AccessibleAbilityManagerService::PackageAdd(const std::string &bundleName)
2097 {
2098     sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
2099     if (!packageAccount) {
2100         HILOG_ERROR("packageAccount is nullptr");
2101         return;
2102     }
2103     for (auto &abilityId : removedAutoStartAbilities_) {
2104         if (packageAccount->GetAbilityAutoStartState(abilityId)) {
2105             packageAccount->SetAbilityAutoStartState(abilityId, false);
2106         }
2107     }
2108     packageAccount->AddAbility(bundleName);
2109 }
2110 
PackageChanged(const std::string & bundleName)2111 void AccessibleAbilityManagerService::PackageChanged(const std::string &bundleName)
2112 {
2113     sptr<AccessibilityAccountData> packageAccount = GetCurrentAccountData();
2114     if (!packageAccount) {
2115         HILOG_ERROR("packageAccount is nullptr");
2116         return;
2117     }
2118 
2119     bool isNeedUpdateShortKeyTarget = false;
2120     std::string target = packageAccount->GetConfig()->GetShortkeyTarget();
2121     if (target.substr(0, target.find("/")) == bundleName) {
2122         isNeedUpdateShortKeyTarget = true;
2123     }
2124     std::vector<std::string> multiTarget = packageAccount->GetConfig()->GetShortkeyMultiTarget();
2125 
2126     packageAccount->ChangeAbility(bundleName);
2127     UpdateAccessibilityManagerService();
2128 
2129     std::vector<std::string> sameBundleTarget;
2130     auto installedAbilities_ = packageAccount->GetInstalledAbilities();
2131     for (auto &installAbility : installedAbilities_) {
2132         std::string abilityId = installAbility.GetId();
2133         if (bundleName != installAbility.GetPackageName()) {
2134             continue;
2135         }
2136         if (abilityId == target) {
2137             isNeedUpdateShortKeyTarget = false;
2138         }
2139         sameBundleTarget.push_back(abilityId);
2140     }
2141 
2142     if (isNeedUpdateShortKeyTarget) {
2143         packageAccount->GetConfig()->SetShortkeyTarget("");
2144         UpdateShortkeyTarget();
2145     }
2146     std::vector<std::string> tmpAbilities = multiTarget;
2147     bool isNeedUpdateShortKeyMultiTarget = false;
2148     Utils::SelectUsefulFromVecWithSameBundle(tmpAbilities, sameBundleTarget,
2149         isNeedUpdateShortKeyMultiTarget, bundleName);
2150     if (isNeedUpdateShortKeyMultiTarget) {
2151         packageAccount->GetConfig()->SetShortkeyMultiTarget(tmpAbilities);
2152         UpdateShortkeyMultiTarget();
2153     }
2154 }
2155 
SetFindFocusedElementInfoResult(const AccessibilityElementInfo & info,const int32_t requestId)2156 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetFindFocusedElementInfoResult(
2157     const AccessibilityElementInfo &info, const int32_t requestId)
2158 {
2159     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2160     if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2161         info.GetAccessibilityId()) == RET_OK) {
2162         HILOG_DEBUG("VerifyingToKenId ok");
2163         accessibilityInfoResult_ = info;
2164         promise_.set_value();
2165     } else {
2166         HILOG_ERROR("VerifyingToKenId failed");
2167         promise_.set_value();
2168     }
2169 }
2170 
SetSearchElementInfoByTextResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2171 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchElementInfoByTextResult(
2172     const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2173 {
2174     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2175     for (auto info : infos) {
2176         if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2177             info.GetAccessibilityId()) == RET_OK) {
2178             HILOG_DEBUG("VerifyingToKenId ok");
2179         } else {
2180             HILOG_ERROR("VerifyingToKenId failed");
2181             elementInfosResult_.clear();
2182             promise_.set_value();
2183             return;
2184         }
2185         elementInfosResult_ = infos;
2186     }
2187     promise_.set_value();
2188 }
2189 
SetSearchElementInfoByAccessibilityIdResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2190 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchElementInfoByAccessibilityIdResult(
2191     const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2192 {
2193     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2194     for (auto info : infos) {
2195         if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2196             info.GetAccessibilityId()) == RET_OK) {
2197             HILOG_DEBUG("VerifyingToKenId ok");
2198         } else {
2199             HILOG_ERROR("VerifyingToKenId failed");
2200             elementInfosResult_.clear();
2201             promise_.set_value();
2202             return;
2203         }
2204         elementInfosResult_ = infos;
2205     }
2206     promise_.set_value();
2207 }
2208 
SetSearchElementInfoBySpecificPropertyResult(const std::list<AccessibilityElementInfo> & infos,const std::list<AccessibilityElementInfo> & treeInfos,const int32_t requestId)2209 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchElementInfoBySpecificPropertyResult(
2210     const std::list<AccessibilityElementInfo> &infos, const std::list<AccessibilityElementInfo> &treeInfos,
2211     const int32_t requestId)
2212 {
2213     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2214     if (!infos.empty()) {
2215         if (!ValidateElementInfos(infos)) {
2216             return;
2217         }
2218         elementInfosResult_.assign(infos.begin(), infos.end());
2219     } else if (!treeInfos.empty()) {
2220         if (!ValidateElementInfos(treeInfos)) {
2221             return;
2222         }
2223         elementInfosResult_.assign(treeInfos.begin(), treeInfos.end());
2224     }
2225     promise_.set_value();
2226 }
2227 
ValidateElementInfos(const std::list<AccessibilityElementInfo> & infos)2228 bool AccessibleAbilityManagerService::ElementOperatorCallbackImpl::ValidateElementInfos(
2229     const std::list<AccessibilityElementInfo>& infos)
2230 {
2231     for (auto info : infos) {
2232         if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2233             info.GetAccessibilityId()) == RET_OK) {
2234             HILOG_DEBUG("VerifyingToKenId ok");
2235         } else {
2236             HILOG_ERROR("VerifyingToKenId failed");
2237             elementInfosResult_.clear();
2238             promise_.set_value();
2239             return false;
2240         }
2241     }
2242     return true;
2243 }
2244 
SetFocusMoveSearchResult(const AccessibilityElementInfo & info,const int32_t requestId)2245 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetFocusMoveSearchResult(
2246     const AccessibilityElementInfo &info, const int32_t requestId)
2247 {
2248     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2249     if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2250         info.GetAccessibilityId()) == RET_OK) {
2251         HILOG_DEBUG("VerifyingToKenId ok");
2252         accessibilityInfoResult_ = info;
2253         promise_.set_value();
2254     } else {
2255         HILOG_ERROR("VerifyingToKenId failed");
2256         promise_.set_value();
2257     }
2258 }
2259 
SetExecuteActionResult(const bool succeeded,const int32_t requestId)2260 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetExecuteActionResult(const bool succeeded,
2261     const int32_t requestId)
2262 {
2263     HILOG_DEBUG("Response [result:%{public}d, requestId:%{public}d]", succeeded, requestId);
2264     executeActionResult_ = succeeded;
2265     promise_.set_value();
2266 }
2267 
SetCursorPositionResult(const int32_t cursorPosition,const int32_t requestId)2268 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetCursorPositionResult(const int32_t cursorPosition,
2269     const int32_t requestId)
2270 {
2271     HILOG_INFO("ElementOperatorCallbackImpl::SetCursorPositionResult [result:%{public}d]",
2272         cursorPosition);
2273     HILOG_DEBUG("cursorPosition [result:%{public}d, requestId:%{public}d]", cursorPosition, requestId);
2274     callCursorPosition_ = cursorPosition;
2275     promise_.set_value();
2276 }
2277 
SetSearchDefaultFocusByWindowIdResult(const std::vector<AccessibilityElementInfo> & infos,const int32_t requestId)2278 void AccessibleAbilityManagerService::ElementOperatorCallbackImpl::SetSearchDefaultFocusByWindowIdResult(
2279     const std::vector<AccessibilityElementInfo> &infos, const int32_t requestId)
2280 {
2281     HILOG_DEBUG("Response [requestId:%{public}d]", requestId);
2282     for (auto info : infos) {
2283         if (Singleton<AccessibleAbilityManagerService>::GetInstance().VerifyingToKenId(info.GetWindowId(),
2284             info.GetAccessibilityId()) == RET_OK) {
2285             HILOG_DEBUG("VerifyingToKenId ok");
2286         } else {
2287             HILOG_ERROR("VerifyingToKenId failed");
2288             elementInfosResult_.clear();
2289             promise_.set_value();
2290             return;
2291         }
2292         elementInfosResult_ = infos;
2293     }
2294     promise_.set_value();
2295 }
2296 
GetParentElementRecursively(int32_t windowId,int64_t elementId,std::vector<AccessibilityElementInfo> & infos)2297 bool AccessibleAbilityManagerService::GetParentElementRecursively(int32_t windowId, int64_t elementId,
2298     std::vector<AccessibilityElementInfo>& infos)
2299 {
2300     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2301     if (!accountData) {
2302         HILOG_ERROR("GetCurrentAccountData failed");
2303         return false;
2304     }
2305 
2306     int32_t treeId = 0;
2307     sptr<IAccessibilityElementOperator> elementOperator = nullptr;
2308     sptr<AccessibilityWindowConnection> connection = accountData->GetAccessibilityWindowConnection(windowId);
2309     if (!connection) {
2310         HILOG_ERROR("GetAccessibilityWindowConnection failed");
2311         return false;
2312     }
2313 
2314     if (elementId > 0) {
2315         treeId = GetTreeIdBySplitElementId(elementId);
2316         elementOperator = connection->GetCardProxy(treeId);
2317     } else {
2318         elementOperator = connection->GetProxy();
2319     }
2320     if (elementOperator == nullptr) {
2321         HILOG_DEBUG("elementOperator failed elementId: %{public}" PRId64 " winId: %{public}d treeId: %{public}d",
2322             elementId, windowId, treeId);
2323         return false;
2324     }
2325     sptr<ElementOperatorCallbackImpl> callBack = new(std::nothrow) ElementOperatorCallbackImpl();
2326     if (callBack == nullptr) {
2327         HILOG_ERROR("Failed to create callBack.");
2328         return false;
2329     }
2330 
2331     ffrt::future<void> promiseFuture = callBack->promise_.get_future();
2332     int32_t requestId = GenerateRequestId();
2333     AddRequestId(windowId, treeId, requestId, callBack);
2334     elementOperator->SearchElementInfoByAccessibilityId(elementId, requestId, callBack, 0);
2335     ffrt::future_status waitFocus = promiseFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
2336     if (waitFocus != ffrt::future_status::ready) {
2337         ipcTimeoutNum_++;
2338         HILOG_ERROR("Failed to wait result, number %{public}" PRId64 "", ipcTimeoutNum_);
2339         return false;
2340     }
2341 
2342     for (auto& info : callBack->elementInfosResult_) {
2343         if (info.GetAccessibilityId() == AccessibilityElementInfo::UNDEFINED_ACCESSIBILITY_ID) {
2344             HILOG_ERROR("SearchElementInfoByAccessibilityId elementInfo from ace is wrong");
2345             return false;
2346         }
2347     }
2348 
2349     infos = callBack->elementInfosResult_;
2350     HILOG_DEBUG("Get parent element success, size %{public}zu", infos.size());
2351     return true;
2352 }
2353 
FindInnerWindowId(const AccessibilityEventInfo & event,int32_t & windowId)2354 void AccessibleAbilityManagerService::FindInnerWindowId(const AccessibilityEventInfo &event, int32_t& windowId)
2355 {
2356     HILOG_DEBUG();
2357     auto mapTable = Singleton<AccessibilityWindowManager>::GetInstance().sceneBoardElementIdMap_.GetAllPairs();
2358     int64_t elementId = event.GetAccessibilityId();
2359     int tmpWindowId = Singleton<AccessibilityWindowManager>::GetInstance().
2360         FindTreeIdWindowIdPair(GetTreeIdBySplitElementId(elementId));
2361     if (tmpWindowId != 0) {
2362         windowId = tmpWindowId;
2363         return;
2364     }
2365     while (1) {
2366         auto iter = std::find_if(mapTable.begin(), mapTable.end(),
2367             [elementId] (const std::pair<int32_t, int64_t>& p) {
2368                 return elementId == p.second;
2369             });
2370         if (iter != mapTable.end()) {
2371             windowId = iter->first;
2372             break;
2373         }
2374         if (event.GetWindowId() == 1 && elementId == 0) {
2375             HILOG_INFO("parent elementId is 0");
2376             break;
2377         }
2378 
2379         int32_t treeId = GetTreeIdBySplitElementId(elementId);
2380         // handle seprately because event send by UiExtension children tree may carry the root elemnt of children
2381         // tree, whose componentType is also root
2382         // deal other eventType like this may lead to performance problem
2383         if (treeId != 0) {
2384             // WindowScene
2385             //       \
2386             // UiExtensionComponent -> try to find the windowId of the event send by its children node
2387             //       \
2388             //       root -> node that send event, and it's a UiExtensionNode
2389             // when elementId is element that at the UiExtension tree, try to get the id of UiExtensionComponent
2390             // by GetRootParentId,
2391             elementId = GetRootParentId(windowId, treeId, elementId);
2392         } else {
2393             // keep find its parent node, until it's a root node or find its elementId in sceneBoardElementIdMap_
2394             // which saves mapping of windowId&root-elementId of the window.
2395             std::vector<AccessibilityElementInfo> infos = {};
2396             if (GetParentElementRecursively(event.GetWindowId(), elementId, infos) == false || infos.size() == 0) {
2397                 HILOG_ERROR("find parent element failed");
2398                 break;
2399             }
2400 
2401             if (infos[0].GetComponentType() == "root") {
2402                 HILOG_ERROR("can not find parent element, has reach root node");
2403                 break;
2404             }
2405 
2406             elementId = infos[0].GetParentNodeId();
2407         }
2408     }
2409     int originTreeId = GetTreeIdBySplitElementId(event.GetAccessibilityId());
2410     Singleton<AccessibilityWindowManager>::GetInstance().InsertTreeIdWindowIdPair(originTreeId, windowId);
2411 }
2412 
UpdateAccessibilityWindowStateByEvent(const AccessibilityEventInfo & event)2413 void AccessibleAbilityManagerService::UpdateAccessibilityWindowStateByEvent(const AccessibilityEventInfo &event)
2414 {
2415     EventType evtType = event.GetEventType();
2416     HILOG_DEBUG("windowId is %{public}d", event.GetWindowId());
2417     int32_t windowId = event.GetWindowId();
2418     if (windowId == 1) {
2419         int32_t innerWindowId = event.GetElementInfo().GetInnerWindowId();
2420         if (innerWindowId > 0) {
2421             windowId = innerWindowId;
2422         } else {
2423             FindInnerWindowId(event, windowId);
2424         }
2425     }
2426 
2427     const_cast<AccessibilityEventInfo&>(event).SetElementMainWindowId(windowId);
2428 
2429     if (windowId < 1) {
2430         HILOG_INFO("windowId is invilid : %{public}d", windowId);
2431         return;
2432     }
2433 
2434     switch (evtType) {
2435         case TYPE_VIEW_HOVER_ENTER_EVENT:
2436             Singleton<AccessibilityWindowManager>::GetInstance().SetActiveWindow(windowId, false);
2437             Singleton<AccessibilityWindowManager>::GetInstance().SetAccessibilityFocusedWindow(windowId);
2438             break;
2439         case TYPE_VIEW_ACCESSIBILITY_FOCUSED_EVENT:
2440             Singleton<AccessibilityWindowManager>::GetInstance().SetAccessibilityFocusedWindow(windowId);
2441             break;
2442         default:
2443             break;
2444     }
2445 }
2446 
UpdateAccessibilityManagerService()2447 void AccessibleAbilityManagerService::UpdateAccessibilityManagerService()
2448 {
2449     HILOG_DEBUG("start.");
2450 
2451     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2452     if (!accountData) {
2453         HILOG_ERROR("Account data is null");
2454         return;
2455     }
2456 
2457     accountData->UpdateAccountCapabilities();
2458     UpdateInputFilter();
2459     UpdateAccessibilityState();
2460     UpdateShortKeyRegister();
2461 }
2462 
UpdateAccessibilityState()2463 void AccessibleAbilityManagerService::UpdateAccessibilityState()
2464 {
2465     HILOG_DEBUG("start.");
2466     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2467     if (!accountData) {
2468         HILOG_ERROR("Account data is null");
2469         return;
2470     }
2471     uint32_t state = accountData->GetAccessibilityState();
2472     if (!(state & STATE_ACCESSIBILITY_ENABLED)) {
2473         Singleton<AccessibilityWindowManager>::GetInstance().ClearAccessibilityFocused();
2474     }
2475 
2476     stateObservers_.OnStateObservers(state);
2477     UpdateCriticalState();
2478 }
2479 
UpdateCriticalState()2480 void AccessibleAbilityManagerService::UpdateCriticalState()
2481 {
2482     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2483     if (!accountData) {
2484         HILOG_ERROR("account data is null");
2485         return;
2486     }
2487     uint32_t accessibilityState = accountData->GetAccessibilityState();
2488     uint32_t inputFlag = accountData->GetInputFilterFlag();
2489     int pid = getpid();
2490     if (accessibilityState != 0 || inputFlag != 0) {
2491         Memory::MemMgrClient::GetInstance().SetCritical(pid, true, ACCESSIBILITY_MANAGER_SERVICE_ID);
2492     } else {
2493         Memory::MemMgrClient::GetInstance().SetCritical(pid, false, ACCESSIBILITY_MANAGER_SERVICE_ID);
2494     }
2495 }
2496 
UpdateCaptionProperty()2497 void AccessibleAbilityManagerService::UpdateCaptionProperty()
2498 {
2499     return accessibilitySettings_->UpdateCaptionProperty();
2500 }
2501 
UpdateSettingsInAtoHosTask()2502 void AccessibleAbilityManagerService::UpdateSettingsInAtoHosTask()
2503 {
2504     HILOG_DEBUG();
2505     if (!handler_) {
2506         HILOG_ERROR("UpdateSettingsInAtoHosTask: handler is nullptr!");
2507         return;
2508     }
2509     handler_->PostTask([=]() {
2510         UpdateSettingsInAtoHos();
2511         }, "UPDATE_SETTINGS_IN_ATOHOS_TASK");
2512 }
2513 
UpdateAutoStartAbilities()2514 void AccessibleAbilityManagerService::UpdateAutoStartAbilities()
2515 {
2516     HILOG_DEBUG();
2517     if (!handler_) {
2518         HILOG_ERROR("UpdateAutoStartAbilities: handler is nullptr.");
2519         return;
2520     }
2521 
2522     handler_->PostTask([=]() {
2523         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2524         if (!accountData) {
2525             HILOG_ERROR("Account data is null");
2526             return;
2527         }
2528         for (auto &abilityId : removedAutoStartAbilities_) {
2529             if (accountData->GetAbilityAutoStartState(abilityId)) {
2530                 accountData->SetAbilityAutoStartState(abilityId, false);
2531             }
2532         }
2533         accountData->UpdateAutoStartEnabledAbilities();
2534         accountData->UpdateAbilities();
2535         }, "UPDATE_AUTO_START_ABILITIES");
2536 }
2537 
UpdateSettingsInAtoHos()2538 void AccessibleAbilityManagerService::UpdateSettingsInAtoHos()
2539 {
2540     HILOG_DEBUG();
2541     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2542     if (!accountData) {
2543         HILOG_ERROR("accountData is nullptr.");
2544         return;
2545     }
2546 
2547     if (!accountData->GetConfig()->GetStartToHosState() || currentAccountId_ != DEFAULT_ACCOUNT_ID) {
2548         HILOG_INFO("Not first start from a to hos.");
2549         return;
2550     }
2551     accessibilitySettings_->UpdateSettingsInAtoHos();
2552 }
2553 
UpdateInputFilter()2554 void AccessibleAbilityManagerService::UpdateInputFilter()
2555 {
2556     HILOG_DEBUG("start.");
2557 
2558     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2559     if (!accountData) {
2560         HILOG_ERROR("Account data is null");
2561         return;
2562     }
2563 
2564     uint32_t flag = accountData->GetInputFilterFlag();
2565     HILOG_DEBUG("InputInterceptor flag is %{public}d", flag);
2566 
2567     inputInterceptor_ = AccessibilityInputInterceptor::GetInstance();
2568     if (!inputInterceptor_) {
2569         HILOG_ERROR("inputInterceptor_ is null.");
2570         return;
2571     }
2572     inputInterceptor_->SetAvailableFunctions(flag);
2573     Utils::RecordStartingA11yEvent(flag);
2574 }
2575 
UpdateAllSetting()2576 void AccessibleAbilityManagerService::UpdateAllSetting()
2577 {
2578     accessibilitySettings_->UpdateAllSetting();
2579 }
2580 
UpdateShortKeyRegister()2581 void AccessibleAbilityManagerService::UpdateShortKeyRegister()
2582 {
2583     HILOG_DEBUG();
2584 
2585     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
2586     if (accountData == nullptr) {
2587         HILOG_ERROR("Account data is null!");
2588         return;
2589     }
2590 
2591     bool shortKeyState = accountData->GetConfig()->GetShortKeyState();
2592     if (shortKeyState) {
2593         accessibilityShortKey_->Unregister();
2594         accessibilityShortKey_->Register();
2595     } else {
2596         accessibilityShortKey_->Unregister();
2597     }
2598 }
2599 
SetScreenMagnificationState(const bool state)2600 ErrCode AccessibleAbilityManagerService::SetScreenMagnificationState(const bool state)
2601 {
2602     PostDelayUnloadTask();
2603     if (!IsSystemApp()) {
2604         HILOG_WARN("Not system app");
2605         return RET_ERR_NOT_SYSTEM_APP;
2606     }
2607     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2608         HILOG_WARN("SetCaptionProperty permission denied.");
2609         return RET_ERR_NO_PERMISSION;
2610     }
2611     return accessibilitySettings_->SetScreenMagnificationState(state);
2612 }
2613 
SetShortKeyState(const bool state)2614 ErrCode AccessibleAbilityManagerService::SetShortKeyState(const bool state)
2615 {
2616     PostDelayUnloadTask();
2617     if (!IsSystemApp()) {
2618         HILOG_WARN("Not system app");
2619         return RET_ERR_NOT_SYSTEM_APP;
2620     }
2621     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2622         HILOG_WARN("SetCaptionProperty permission denied.");
2623         return RET_ERR_NO_PERMISSION;
2624     }
2625     return accessibilitySettings_->SetShortKeyState(state);
2626 }
2627 
SetMouseKeyState(const bool state)2628 ErrCode AccessibleAbilityManagerService::SetMouseKeyState(const bool state)
2629 {
2630     PostDelayUnloadTask();
2631     if (!IsSystemApp()) {
2632         HILOG_WARN("Not system app");
2633         return RET_ERR_NOT_SYSTEM_APP;
2634     }
2635     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2636         HILOG_WARN("SetCaptionProperty permission denied.");
2637         return RET_ERR_NO_PERMISSION;
2638     }
2639     return accessibilitySettings_->SetMouseKeyState(state);
2640 }
2641 
SetMouseAutoClick(const int32_t time)2642 ErrCode AccessibleAbilityManagerService::SetMouseAutoClick(const int32_t time)
2643 {
2644     PostDelayUnloadTask();
2645     if (!IsSystemApp()) {
2646         HILOG_WARN("Not system app");
2647         return RET_ERR_NOT_SYSTEM_APP;
2648     }
2649     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2650         HILOG_WARN("SetCaptionProperty permission denied.");
2651         return RET_ERR_NO_PERMISSION;
2652     }
2653     return accessibilitySettings_->SetMouseAutoClick(time);
2654 }
2655 
SetShortkeyTarget(const std::string & name)2656 ErrCode AccessibleAbilityManagerService::SetShortkeyTarget(const std::string &name)
2657 {
2658     PostDelayUnloadTask();
2659     if (!IsSystemApp()) {
2660         HILOG_WARN("Not system app");
2661         return RET_ERR_NOT_SYSTEM_APP;
2662     }
2663     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2664         HILOG_WARN("SetCaptionProperty permission denied.");
2665         return RET_ERR_NO_PERMISSION;
2666     }
2667     return accessibilitySettings_->SetShortkeyTarget(name);
2668 }
2669 
SetShortkeyMultiTarget(const std::vector<std::string> & name)2670 ErrCode AccessibleAbilityManagerService::SetShortkeyMultiTarget(const std::vector<std::string> &name)
2671 {
2672     PostDelayUnloadTask();
2673     if (!IsSystemApp()) {
2674         HILOG_WARN("Not system app");
2675         return RET_ERR_NOT_SYSTEM_APP;
2676     }
2677     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2678         HILOG_WARN("SetCaptionProperty permission denied.");
2679         return RET_ERR_NO_PERMISSION;
2680     }
2681     return accessibilitySettings_->SetShortkeyMultiTarget(name);
2682 }
2683 
SetHighContrastTextState(const bool state)2684 ErrCode AccessibleAbilityManagerService::SetHighContrastTextState(const bool state)
2685 {
2686     PostDelayUnloadTask();
2687     if (!IsSystemApp()) {
2688         HILOG_WARN("Not system app");
2689         return RET_ERR_NOT_SYSTEM_APP;
2690     }
2691     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2692         HILOG_WARN("SetCaptionProperty permission denied.");
2693         return RET_ERR_NO_PERMISSION;
2694     }
2695     return accessibilitySettings_->SetHighContrastTextState(state);
2696 }
2697 
SetDaltonizationState(const bool state)2698 ErrCode AccessibleAbilityManagerService::SetDaltonizationState(const bool state)
2699 {
2700     PostDelayUnloadTask();
2701     if (!IsSystemApp()) {
2702         HILOG_WARN("Not system app");
2703         return RET_ERR_NOT_SYSTEM_APP;
2704     }
2705     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2706         HILOG_WARN("SetCaptionProperty permission denied.");
2707         return RET_ERR_NO_PERMISSION;
2708     }
2709     return accessibilitySettings_->SetDaltonizationState(state);
2710 }
2711 
SetInvertColorState(const bool state)2712 ErrCode AccessibleAbilityManagerService::SetInvertColorState(const bool state)
2713 {
2714     PostDelayUnloadTask();
2715     if (!IsSystemApp()) {
2716         HILOG_WARN("Not system app");
2717         return RET_ERR_NOT_SYSTEM_APP;
2718     }
2719     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2720         HILOG_WARN("SetCaptionProperty permission denied.");
2721         return RET_ERR_NO_PERMISSION;
2722     }
2723     return accessibilitySettings_->SetInvertColorState(state);
2724 }
2725 
SetAnimationOffState(const bool state)2726 ErrCode AccessibleAbilityManagerService::SetAnimationOffState(const bool state)
2727 {
2728     PostDelayUnloadTask();
2729     if (!IsSystemApp()) {
2730         HILOG_WARN("Not system app");
2731         return RET_ERR_NOT_SYSTEM_APP;
2732     }
2733     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2734         HILOG_WARN("SetCaptionProperty permission denied.");
2735         return RET_ERR_NO_PERMISSION;
2736     }
2737     return accessibilitySettings_->SetAnimationOffState(state);
2738 }
2739 
SetAudioMonoState(const bool state)2740 ErrCode AccessibleAbilityManagerService::SetAudioMonoState(const bool state)
2741 {
2742     PostDelayUnloadTask();
2743     if (!IsSystemApp()) {
2744         HILOG_WARN("Not system app");
2745         return RET_ERR_NOT_SYSTEM_APP;
2746     }
2747     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2748         HILOG_WARN("SetCaptionProperty permission denied.");
2749         return RET_ERR_NO_PERMISSION;
2750     }
2751     return accessibilitySettings_->SetAudioMonoState(state);
2752 }
2753 
SetDaltonizationColorFilter(const uint32_t filter)2754 ErrCode AccessibleAbilityManagerService::SetDaltonizationColorFilter(const uint32_t filter)
2755 {
2756     PostDelayUnloadTask();
2757     if (!IsSystemApp()) {
2758         HILOG_WARN("Not system app");
2759         return RET_ERR_NOT_SYSTEM_APP;
2760     }
2761     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2762         HILOG_WARN("SetCaptionProperty permission denied.");
2763         return RET_ERR_NO_PERMISSION;
2764     }
2765     return accessibilitySettings_->SetDaltonizationColorFilter(filter);
2766 }
2767 
SetContentTimeout(const uint32_t time)2768 ErrCode AccessibleAbilityManagerService::SetContentTimeout(const uint32_t time)
2769 {
2770     PostDelayUnloadTask();
2771     if (!IsSystemApp()) {
2772         HILOG_WARN("Not system app");
2773         return RET_ERR_NOT_SYSTEM_APP;
2774     }
2775     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2776         HILOG_WARN("SetCaptionProperty permission denied.");
2777         return RET_ERR_NO_PERMISSION;
2778     }
2779     return accessibilitySettings_->SetContentTimeout(time);
2780 }
2781 
SetBrightnessDiscount(const float discount)2782 ErrCode AccessibleAbilityManagerService::SetBrightnessDiscount(const float discount)
2783 {
2784     PostDelayUnloadTask();
2785     if (!IsSystemApp()) {
2786         HILOG_WARN("Not system app");
2787         return RET_ERR_NOT_SYSTEM_APP;
2788     }
2789     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2790         HILOG_WARN("SetCaptionProperty permission denied.");
2791         return RET_ERR_NO_PERMISSION;
2792     }
2793     return accessibilitySettings_->SetBrightnessDiscount(discount);
2794 }
2795 
SetAudioBalance(const float balance)2796 ErrCode AccessibleAbilityManagerService::SetAudioBalance(const float balance)
2797 {
2798     PostDelayUnloadTask();
2799     if (!IsSystemApp()) {
2800         HILOG_WARN("Not system app");
2801         return RET_ERR_NOT_SYSTEM_APP;
2802     }
2803     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2804         HILOG_WARN("SetCaptionProperty permission denied.");
2805         return RET_ERR_NO_PERMISSION;
2806     }
2807     return accessibilitySettings_->SetAudioBalance(balance);
2808 }
2809 
SetClickResponseTime(const uint32_t time)2810 ErrCode AccessibleAbilityManagerService::SetClickResponseTime(const uint32_t time)
2811 {
2812     PostDelayUnloadTask();
2813     if (!IsSystemApp()) {
2814         HILOG_WARN("Not system app");
2815         return RET_ERR_NOT_SYSTEM_APP;
2816     }
2817     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2818         HILOG_WARN("SetCaptionProperty permission denied.");
2819         return RET_ERR_NO_PERMISSION;
2820     }
2821     return accessibilitySettings_->SetClickResponseTime(time);
2822 }
2823 
SetIgnoreRepeatClickState(const bool state)2824 ErrCode AccessibleAbilityManagerService::SetIgnoreRepeatClickState(const bool state)
2825 {
2826     PostDelayUnloadTask();
2827     if (!IsSystemApp()) {
2828         HILOG_WARN("Not system app");
2829         return RET_ERR_NOT_SYSTEM_APP;
2830     }
2831     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2832         HILOG_WARN("SetCaptionProperty permission denied.");
2833         return RET_ERR_NO_PERMISSION;
2834     }
2835     return accessibilitySettings_->SetIgnoreRepeatClickState(state);
2836 }
2837 
SetIgnoreRepeatClickTime(const uint32_t time)2838 ErrCode AccessibleAbilityManagerService::SetIgnoreRepeatClickTime(const uint32_t time)
2839 {
2840     PostDelayUnloadTask();
2841     if (!IsSystemApp()) {
2842         HILOG_WARN("Not system app");
2843         return RET_ERR_NOT_SYSTEM_APP;
2844     }
2845     if (!CheckPermission(OHOS_PERMISSION_WRITE_ACCESSIBILITY_CONFIG)) {
2846         HILOG_WARN("SetCaptionProperty permission denied.");
2847         return RET_ERR_NO_PERMISSION;
2848     }
2849     return accessibilitySettings_->SetIgnoreRepeatClickTime(time);
2850 }
2851 
GetScreenMagnificationState(bool & state)2852 ErrCode AccessibleAbilityManagerService::GetScreenMagnificationState(bool &state)
2853 {
2854     PostDelayUnloadTask();
2855     if (!IsSystemApp()) {
2856         HILOG_WARN("Not system app");
2857         return RET_ERR_NOT_SYSTEM_APP;
2858     }
2859     return accessibilitySettings_->GetScreenMagnificationState(state);
2860 }
2861 
GetShortKeyState(bool & state)2862 ErrCode AccessibleAbilityManagerService::GetShortKeyState(bool &state)
2863 {
2864     PostDelayUnloadTask();
2865     if (!IsSystemApp()) {
2866         HILOG_WARN("Not system app");
2867         return RET_ERR_NOT_SYSTEM_APP;
2868     }
2869     return accessibilitySettings_->GetShortKeyState(state);
2870 }
2871 
GetMouseKeyState(bool & state)2872 ErrCode AccessibleAbilityManagerService::GetMouseKeyState(bool &state)
2873 {
2874     PostDelayUnloadTask();
2875     if (!IsSystemApp()) {
2876         HILOG_WARN("Not system app");
2877         return RET_ERR_NOT_SYSTEM_APP;
2878     }
2879     return accessibilitySettings_->GetMouseKeyState(state);
2880 }
2881 
GetMouseAutoClick(int32_t & time)2882 ErrCode AccessibleAbilityManagerService::GetMouseAutoClick(int32_t &time)
2883 {
2884     PostDelayUnloadTask();
2885     if (!IsSystemApp()) {
2886         HILOG_WARN("Not system app");
2887         return RET_ERR_NOT_SYSTEM_APP;
2888     }
2889     return accessibilitySettings_->GetMouseAutoClick(time);
2890 }
2891 
GetShortkeyTarget(std::string & name)2892 ErrCode AccessibleAbilityManagerService::GetShortkeyTarget(std::string &name)
2893 {
2894     PostDelayUnloadTask();
2895     if (!IsSystemApp()) {
2896         HILOG_WARN("Not system app");
2897         return RET_ERR_NOT_SYSTEM_APP;
2898     }
2899     return accessibilitySettings_->GetShortkeyTarget(name);
2900 }
2901 
GetShortkeyMultiTarget(std::vector<std::string> & name)2902 ErrCode AccessibleAbilityManagerService::GetShortkeyMultiTarget(std::vector<std::string> &name)
2903 {
2904     PostDelayUnloadTask();
2905     if (!IsSystemApp()) {
2906         HILOG_WARN("Not system app");
2907         return RET_ERR_NOT_SYSTEM_APP;
2908     }
2909     return accessibilitySettings_->GetShortkeyMultiTarget(name);
2910 }
2911 
GetHighContrastTextState(bool & state)2912 ErrCode AccessibleAbilityManagerService::GetHighContrastTextState(bool &state)
2913 {
2914     PostDelayUnloadTask();
2915     if (!IsSystemApp()) {
2916         HILOG_WARN("Not system app");
2917         return RET_ERR_NOT_SYSTEM_APP;
2918     }
2919     return accessibilitySettings_->GetHighContrastTextState(state);
2920 }
2921 
GetDaltonizationState(bool & state)2922 ErrCode AccessibleAbilityManagerService::GetDaltonizationState(bool &state)
2923 {
2924     PostDelayUnloadTask();
2925     if (!IsSystemApp()) {
2926         HILOG_WARN("Not system app");
2927         return RET_ERR_NOT_SYSTEM_APP;
2928     }
2929     return accessibilitySettings_->GetDaltonizationState(state);
2930 }
2931 
GetInvertColorState(bool & state)2932 ErrCode AccessibleAbilityManagerService::GetInvertColorState(bool &state)
2933 {
2934     PostDelayUnloadTask();
2935     if (!IsSystemApp()) {
2936         HILOG_WARN("Not system app");
2937         return RET_ERR_NOT_SYSTEM_APP;
2938     }
2939     return accessibilitySettings_->GetInvertColorState(state);
2940 }
2941 
GetAnimationOffState(bool & state)2942 ErrCode AccessibleAbilityManagerService::GetAnimationOffState(bool &state)
2943 {
2944     PostDelayUnloadTask();
2945     if (!IsSystemApp()) {
2946         HILOG_WARN("Not system app");
2947         return RET_ERR_NOT_SYSTEM_APP;
2948     }
2949     return accessibilitySettings_->GetAnimationOffState(state);
2950 }
2951 
GetAudioMonoState(bool & state)2952 ErrCode AccessibleAbilityManagerService::GetAudioMonoState(bool &state)
2953 {
2954     PostDelayUnloadTask();
2955     if (!IsSystemApp()) {
2956         HILOG_WARN("Not system app");
2957         return RET_ERR_NOT_SYSTEM_APP;
2958     }
2959     return accessibilitySettings_->GetAudioMonoState(state);
2960 }
2961 
GetDaltonizationColorFilter(uint32_t & type)2962 ErrCode AccessibleAbilityManagerService::GetDaltonizationColorFilter(uint32_t &type)
2963 {
2964     PostDelayUnloadTask();
2965     if (!IsSystemApp()) {
2966         HILOG_WARN("Not system app");
2967         return RET_ERR_NOT_SYSTEM_APP;
2968     }
2969     return accessibilitySettings_->GetDaltonizationColorFilter(type);
2970 }
2971 
GetContentTimeout(uint32_t & timer)2972 ErrCode AccessibleAbilityManagerService::GetContentTimeout(uint32_t &timer)
2973 {
2974     PostDelayUnloadTask();
2975     if (!IsSystemApp()) {
2976         HILOG_WARN("Not system app");
2977         return RET_ERR_NOT_SYSTEM_APP;
2978     }
2979     return accessibilitySettings_->GetContentTimeout(timer);
2980 }
2981 
GetBrightnessDiscount(float & brightness)2982 ErrCode AccessibleAbilityManagerService::GetBrightnessDiscount(float &brightness)
2983 {
2984     PostDelayUnloadTask();
2985     if (!IsSystemApp()) {
2986         HILOG_WARN("Not system app");
2987         return RET_ERR_NOT_SYSTEM_APP;
2988     }
2989     return accessibilitySettings_->GetBrightnessDiscount(brightness);
2990 }
2991 
GetAudioBalance(float & balance)2992 ErrCode AccessibleAbilityManagerService::GetAudioBalance(float &balance)
2993 {
2994     PostDelayUnloadTask();
2995     if (!IsSystemApp()) {
2996         HILOG_WARN("Not system app");
2997         return RET_ERR_NOT_SYSTEM_APP;
2998     }
2999     return accessibilitySettings_->GetAudioBalance(balance);
3000 }
3001 
GetClickResponseTime(uint32_t & time)3002 ErrCode AccessibleAbilityManagerService::GetClickResponseTime(uint32_t &time)
3003 {
3004     PostDelayUnloadTask();
3005     if (!IsSystemApp()) {
3006         HILOG_WARN("Not system app");
3007         return RET_ERR_NOT_SYSTEM_APP;
3008     }
3009     return accessibilitySettings_->GetClickResponseTime(time);
3010 }
3011 
GetIgnoreRepeatClickState(bool & state)3012 ErrCode AccessibleAbilityManagerService::GetIgnoreRepeatClickState(bool &state)
3013 {
3014     PostDelayUnloadTask();
3015     if (!IsSystemApp()) {
3016         HILOG_WARN("Not system app");
3017         return RET_ERR_NOT_SYSTEM_APP;
3018     }
3019     return accessibilitySettings_->GetIgnoreRepeatClickState(state);
3020 }
3021 
GetIgnoreRepeatClickTime(uint32_t & time)3022 ErrCode AccessibleAbilityManagerService::GetIgnoreRepeatClickTime(uint32_t &time)
3023 {
3024     PostDelayUnloadTask();
3025     if (!IsSystemApp()) {
3026         HILOG_WARN("Not system app");
3027         return RET_ERR_NOT_SYSTEM_APP;
3028     }
3029     return accessibilitySettings_->GetIgnoreRepeatClickTime(time);
3030 }
3031 
GetAllConfigs(AccessibilityConfigData & configData,CaptionPropertyParcel & caption)3032 ErrCode AccessibleAbilityManagerService::GetAllConfigs(AccessibilityConfigData& configData,
3033     CaptionPropertyParcel& caption)
3034 {
3035     HILOG_DEBUG();
3036     if (!IsSystemApp()) {
3037         HILOG_WARN("Not system app");
3038         return RET_ERR_NOT_SYSTEM_APP;
3039     }
3040 
3041     XCollieHelper timer(TIMER_GET_ALL_CONFIG, XCOLLIE_TIMEOUT);
3042     std::shared_ptr<ffrt::promise<ErrCode>> syncPromise = std::make_shared<ffrt::promise<ErrCode>>();
3043     std::shared_ptr<AccessibilityConfigData> config = std::make_shared<AccessibilityConfigData>();
3044     std::shared_ptr<CaptionProperty> captionInfo = std::make_shared<CaptionProperty>(caption);
3045     if (syncPromise == nullptr || config == nullptr || captionInfo == nullptr) {
3046         HILOG_WARN("create syncPromise or config failed");
3047         return ERR_INVALID_DATA;
3048     }
3049     ffrt::future syncFuture = syncPromise->get_future();
3050     actionHandler_->PostTask([this, syncPromise, config, captionInfo]() {
3051         HILOG_DEBUG();
3052         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3053         if (!accountData) {
3054             HILOG_ERROR("accountData is nullptr");
3055             syncPromise->set_value(ERR_INVALID_DATA);
3056             return;
3057         }
3058 
3059         config->highContrastText_ = accountData->GetConfig()->GetHighContrastTextState();
3060         config->daltonizationState_ = accountData->GetConfig()->GetDaltonizationState();
3061         config->invertColor_ = accountData->GetConfig()->GetInvertColorState();
3062         config->animationOff_ = accountData->GetConfig()->GetAnimationOffState();
3063         config->audioMono_ = accountData->GetConfig()->GetAudioMonoState();
3064         config->mouseKey_ = accountData->GetConfig()->GetMouseKeyState();
3065         config->captionState_ = accountData->GetConfig()->GetCaptionState();
3066         config->screenMagnifier_ = accountData->GetConfig()->GetScreenMagnificationState();
3067         config->shortkey_ = accountData->GetConfig()->GetShortKeyState();
3068         config->mouseAutoClick_ = accountData->GetConfig()->GetMouseAutoClick();
3069         config->daltonizationColorFilter_ = accountData->GetConfig()->GetDaltonizationColorFilter();
3070         config->contentTimeout_ = accountData->GetConfig()->GetContentTimeout();
3071         config->brightnessDiscount_ = accountData->GetConfig()->GetBrightnessDiscount();
3072         config->audioBalance_ = accountData->GetConfig()->GetAudioBalance();
3073         config->shortkeyTarget_ = accountData->GetConfig()->GetShortkeyTarget();
3074         config->shortkeyMultiTarget_ = accountData->GetConfig()->GetShortkeyMultiTarget();
3075         *captionInfo = accountData->GetConfig()->GetCaptionProperty();
3076         syncPromise->set_value(ERR_OK);
3077         }, "TASK_GET_ALL_CONFIGS");
3078 
3079     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
3080     if (wait != ffrt::future_status::ready) {
3081         HILOG_ERROR("Failed to wait GetAllConfigs result");
3082         return ERR_TRANSACTION_FAILED;
3083     }
3084     configData = *config;
3085     return syncFuture.get();
3086 }
3087 
EnableShortKeyTargetAbility(const std::string & name)3088 bool AccessibleAbilityManagerService::EnableShortKeyTargetAbility(const std::string &name)
3089 {
3090     HILOG_DEBUG();
3091     HILOG_INFO("EnableShortKeyTargetAbility name = %{public}s", name.c_str());
3092 #ifdef OHOS_BUILD_ENABLE_HITRACE
3093     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "EnableShortKeyTargetAbility");
3094 #endif // OHOS_BUILD_ENABLE_HITRACE
3095 
3096     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3097     if (!accountData) {
3098         HILOG_ERROR("accountData is nullptr");
3099         return false;
3100     }
3101 
3102     std::string targetAbility;
3103     if (name != "") {
3104         targetAbility = name;
3105     } else {
3106         targetAbility = accountData->GetConfig()->GetShortkeyTarget();
3107         HILOG_DEBUG("target ability is [%{public}s]", targetAbility.c_str());
3108         if (targetAbility == "") {
3109             HILOG_ERROR("target ability is null");
3110             return false;
3111         }
3112     }
3113 
3114     auto it = AccessibilityConfigTable.find(targetAbility);
3115     if (it != AccessibilityConfigTable.end()) {
3116         return SetTargetAbility(it->second);
3117     }
3118 
3119     uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
3120         CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
3121     RetError enableState = accountData->EnableAbility(targetAbility, capabilities);
3122     if (enableState == RET_ERR_CONNECTION_EXIST) {
3123         HILOG_DEBUG();
3124         Utils::RecordEnableShortkeyAbilityEvent(targetAbility, false);
3125         return InnerDisableAbility(targetAbility) == RET_OK;
3126     } else if (enableState == RET_OK) {
3127         Utils::RecordEnableShortkeyAbilityEvent(targetAbility, true);
3128         return true;
3129     } else {
3130         return false;
3131     }
3132 }
3133 
OnShortKeyProcess()3134 void AccessibleAbilityManagerService::OnShortKeyProcess()
3135 {
3136     HILOG_DEBUG();
3137 
3138     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3139     if (accountData == nullptr) {
3140         HILOG_ERROR("accountData is nullptr");
3141         return;
3142     }
3143 
3144     std::shared_ptr<AccessibilityShortkeyDialog> shortkeyDialog = std::make_shared<AccessibilityShortkeyDialog>();
3145 
3146     std::shared_ptr<AccessibilitySettingProvider> service =
3147         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3148     if (service == nullptr) {
3149         HILOG_ERROR("service is nullptr");
3150         return;
3151     }
3152     bool oobeState = false;
3153     bool userSetupState = false;
3154     service->GetBoolValue(DEVICE_PROVISIONED, oobeState, true);
3155     if (accountData->GetConfig()->GetDbHandle()) {
3156         userSetupState = accountData->GetConfig()->GetDbHandle()->GetBoolValue(USER_SETUP_COMPLETED, false, true);
3157     }
3158     if (oobeState && userSetupState) {
3159         int32_t shortKeyTimeout = accountData->GetConfig()->GetShortKeyTimeout();
3160         if (shortKeyTimeout == SHORT_KEY_TIMEOUT_BEFORE_USE) {
3161             HILOG_INFO("first use short cut key");
3162             accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
3163             shortkeyDialog->ConnectDialog(ShortKeyDialogType::RECONFIRM);
3164             return;
3165         }
3166     }
3167 
3168     std::vector<std::string> shortkeyMultiTarget = accountData->GetConfig()->GetShortkeyMultiTarget();
3169     if (shortkeyMultiTarget.size() == 0) {
3170         EnableShortKeyTargetAbility();
3171     } else if (shortkeyMultiTarget.size() == 1) {
3172         EnableShortKeyTargetAbility(shortkeyMultiTarget[0]);
3173     } else {
3174         // dialog
3175         if (shortkeyDialog->ConnectDialog(ShortKeyDialogType::FUNCTION_SELECT)) {
3176             HILOG_DEBUG("ready to build dialog");
3177         }
3178     }
3179 }
3180 
DisableShortKeyTargetAbility()3181 bool AccessibleAbilityManagerService::DisableShortKeyTargetAbility()
3182 {
3183     HILOG_DEBUG();
3184     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3185     if (!accountData) {
3186         HILOG_ERROR("accountData is nullptr");
3187         return false;
3188     }
3189 
3190     std::string targetAbility = accountData->GetConfig()->GetShortkeyTarget();
3191     HILOG_DEBUG("target ability is [%{public}s]", targetAbility.c_str());
3192     if (targetAbility == "") {
3193         HILOG_ERROR("target ability is null");
3194         return false;
3195     }
3196     return InnerDisableAbility(targetAbility) == RET_OK;
3197 }
3198 
RegisterConfigObserver(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)3199 ErrCode AccessibleAbilityManagerService::RegisterConfigObserver(
3200     const sptr<IAccessibleAbilityManagerConfigObserver> &callback)
3201 {
3202     HILOG_DEBUG();
3203     if (!callback || !actionHandler_) {
3204         HILOG_ERROR("Parameters check failed!");
3205         return ERR_INVALID_VALUE;
3206     }
3207     XCollieHelper timer(TIMER_REGISTER_CONFIG_OBSERVER, XCOLLIE_TIMEOUT);
3208     std::shared_ptr<ffrt::promise<uint32_t>> syncPromisePtr = std::make_shared<ffrt::promise<uint32_t>>();
3209     ffrt::future syncFuture = syncPromisePtr->get_future();
3210     actionHandler_->PostTask([this, syncPromisePtr, callback]() {
3211         HILOG_DEBUG();
3212         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3213         if (!accountData) {
3214             HILOG_ERROR("Account data is null");
3215             syncPromisePtr->set_value(ERR_INVALID_VALUE);
3216             return;
3217         }
3218         if (!configCallbackDeathRecipient_) {
3219             configCallbackDeathRecipient_ = new(std::nothrow) ConfigCallbackDeathRecipient();
3220             if (!configCallbackDeathRecipient_) {
3221                 HILOG_ERROR("configCallbackDeathRecipient_ is null");
3222                 syncPromisePtr->set_value(ERR_INVALID_VALUE);
3223                 return;
3224             }
3225         }
3226         if (!callback->AsObject()) {
3227             HILOG_ERROR("object is null");
3228             syncPromisePtr->set_value(0);
3229             return;
3230         }
3231         callback->AsObject()->AddDeathRecipient(configCallbackDeathRecipient_);
3232         accountData->AddConfigCallback(callback);
3233         HILOG_DEBUG("the size of caption property callbacks is %{public}zu",
3234             accountData->GetConfigCallbacks().size());
3235         syncPromisePtr->set_value(NO_ERROR);
3236         }, "TASK_REGISTER_CONFIG_OBSERVER");
3237 
3238     ffrt::future_status wait = syncFuture.wait_for(std::chrono::milliseconds(TIME_OUT_OPERATOR));
3239     if (wait != ffrt::future_status::ready) {
3240         HILOG_ERROR("Failed to wait RegisterConfigObserver result");
3241         return RET_ERR_TIME_OUT;
3242     }
3243     return syncFuture.get();
3244 }
3245 
OnRemoteDied(const wptr<IRemoteObject> & remote)3246 void AccessibleAbilityManagerService::ConfigCallbackDeathRecipient::OnRemoteDied(
3247     const wptr<IRemoteObject> &remote)
3248 {
3249     Singleton<AccessibleAbilityManagerService>::GetInstance().RemoveCallback(CONFIG_CALLBACK, this, remote);
3250 }
3251 
UpdateConfigState()3252 void AccessibleAbilityManagerService::UpdateConfigState()
3253 {
3254     return accessibilitySettings_->UpdateConfigState();
3255 }
3256 
UpdateShortkeyTarget()3257 void AccessibleAbilityManagerService::UpdateShortkeyTarget()
3258 {
3259     return accessibilitySettings_->UpdateShortkeyTarget();
3260 }
3261 
UpdateShortkeyMultiTarget()3262 void AccessibleAbilityManagerService::UpdateShortkeyMultiTarget()
3263 {
3264     return accessibilitySettings_->UpdateShortkeyMultiTarget();
3265 }
3266 
RemoveCallback(CallBackID callback,const sptr<DeathRecipient> & recipient,const wptr<IRemoteObject> & remote)3267 void AccessibleAbilityManagerService::RemoveCallback(CallBackID callback,
3268     const sptr<DeathRecipient> &recipient, const wptr<IRemoteObject> &remote)
3269 {
3270     HILOG_INFO("remove callback[%{public}d]", callback);
3271     if (!handler_) {
3272         HILOG_ERROR("handler is nullptr");
3273         return;
3274     }
3275     handler_->PostTask([=]() {
3276         if (!remote.GetRefPtr()) {
3277             HILOG_ERROR("remote is null");
3278             return;
3279         }
3280         remote->RemoveDeathRecipient(recipient);
3281 
3282         if (callback == CONFIG_CALLBACK) {
3283             RemoveSavedConfigCallback(remote);
3284         }
3285         auto accountData = GetCurrentAccountData();
3286         if (!accountData) {
3287             HILOG_ERROR("Current account data is null");
3288             return;
3289         }
3290         switch (callback) {
3291             case STATE_CALLBACK:
3292                 stateObservers_.RemoveStateObserver(remote);
3293                 break;
3294             case CAPTION_PROPERTY_CALLBACK:
3295                 accountData->RemoveCaptionPropertyCallback(remote);
3296                 break;
3297             case ENABLE_ABILITY_LISTS_CALLBACK:
3298                 accountData->RemoveEnableAbilityListsObserver(remote);
3299                 break;
3300             case CONFIG_CALLBACK:
3301                 accountData->RemoveConfigCallback(remote);
3302                 break;
3303             default:
3304                 break;
3305         }
3306         }, "RemoveCallback");
3307 }
3308 
RemoveSavedConfigCallback(const wptr<IRemoteObject> & callback)3309 void AccessibleAbilityManagerService::RemoveSavedConfigCallback(const wptr<IRemoteObject>& callback)
3310 {
3311     HILOG_DEBUG("start.");
3312     for (auto itr = defaultConfigCallbacks_.begin(); itr != defaultConfigCallbacks_.end(); itr++) {
3313         if ((*itr)->AsObject() == callback) {
3314             defaultConfigCallbacks_.erase(itr);
3315             break;
3316         }
3317     }
3318 }
3319 
AddStateObserver(const sptr<IAccessibleAbilityManagerStateObserver> & stateObserver)3320 void AccessibleAbilityManagerService::StateObservers::AddStateObserver(
3321     const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver)
3322 {
3323     std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
3324     auto iter = std::find(observersList_.begin(), observersList_.end(), stateObserver);
3325     if (iter == observersList_.end()) {
3326         observersList_.push_back(stateObserver);
3327         HILOG_DEBUG("register state observer successfully");
3328         return;
3329     }
3330 
3331     HILOG_INFO("state observer is existed");
3332 }
3333 
OnStateObservers(uint32_t state)3334 void AccessibleAbilityManagerService::StateObservers::OnStateObservers(uint32_t state)
3335 {
3336     std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
3337     for (auto& stateObserver : observersList_) {
3338         if (stateObserver) {
3339             stateObserver->OnStateChanged(state);
3340         }
3341     }
3342 }
3343 
RemoveStateObserver(const wptr<IRemoteObject> & remote)3344 void AccessibleAbilityManagerService::StateObservers::RemoveStateObserver(const wptr<IRemoteObject> &remote)
3345 {
3346     std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
3347     auto iter = std::find_if(observersList_.begin(), observersList_.end(),
3348         [remote](const sptr<IAccessibleAbilityManagerStateObserver>& stateObserver) {
3349             return stateObserver->AsObject() == remote;
3350         });
3351     if (iter != observersList_.end()) {
3352         observersList_.erase(iter);
3353     }
3354 }
3355 
Clear()3356 void AccessibleAbilityManagerService::StateObservers::Clear()
3357 {
3358     std::lock_guard<ffrt::mutex> lock(stateObserversMutex_);
3359     observersList_.clear();
3360 }
3361 
GetFocusedWindowId(int32_t & focusedWindowId)3362 ErrCode AccessibleAbilityManagerService::GetFocusedWindowId(int32_t &focusedWindowId)
3363 {
3364     HILOG_DEBUG();
3365     return Singleton<AccessibilityWindowManager>::GetInstance().GetFocusedWindowId(focusedWindowId);
3366 }
3367 
InsertWindowIdEventPair(int32_t windowId,const AccessibilityEventInfo & event)3368 void AccessibleAbilityManagerService::InsertWindowIdEventPair(int32_t windowId, const AccessibilityEventInfo &event)
3369 {
3370     HILOG_DEBUG("insert event, windowId: %{public}d", windowId);
3371     windowFocusEventMap_.EnsureInsert(windowId, event);
3372 }
3373 
CheckWindowIdEventExist(int32_t windowId)3374 bool AccessibleAbilityManagerService::CheckWindowIdEventExist(int32_t windowId)
3375 {
3376     AccessibilityEventInfo eventInfo;
3377     return windowFocusEventMap_.Find(windowId, eventInfo);
3378 }
3379 
CheckWindowRegister(int32_t windowId)3380 bool AccessibleAbilityManagerService::CheckWindowRegister(int32_t windowId)
3381 {
3382     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3383     if (!accountData) {
3384         HILOG_ERROR("accountData is nullptr.");
3385         return false;
3386     }
3387     return accountData->GetAccessibilityWindowConnection(windowId) != nullptr;
3388 }
3389 
OnDeviceProvisioned()3390 void AccessibleAbilityManagerService::OnDeviceProvisioned()
3391 {
3392     HILOG_DEBUG();
3393     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3394     if (!accountData) {
3395         HILOG_ERROR("accountData is nullptr");
3396         return;
3397     }
3398     std::shared_ptr<AccessibilitySettingProvider> service =
3399         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3400     if (service == nullptr) {
3401         HILOG_ERROR("service is nullptr");
3402         return;
3403     }
3404     service->UnregisterObserver(DEVICE_PROVISIONED);
3405     if (accountData->GetConfig()->GetDbHandle()) {
3406         accountData->GetConfig()->GetDbHandle()->UnregisterObserver(USER_SETUP_COMPLETED);
3407     }
3408     if (accountData->GetDefaultUserScreenReaderState()) {
3409         HILOG_INFO("Modify shortKeyTimeout and shortKeyOnLockScreenState");
3410         accountData->GetConfig()->SetShortKeyTimeout(SHORT_KEY_TIMEOUT_AFTER_USE);
3411         accountData->GetConfig()->SetShortKeyOnLockScreenState(true);
3412         UpdateConfigState();
3413     }
3414 }
3415 
InitializeShortKeyState()3416 void AccessibleAbilityManagerService::InitializeShortKeyState()
3417 {
3418     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3419     if (!accountData) {
3420         HILOG_ERROR("accountData is nullptr");
3421         return;
3422     }
3423 
3424     bool shortKeyFlag = false;
3425     if (accountData->GetAccountId() != DEFAULT_ACCOUNT_ID && accountData->GetConfig()->GetDbHandle() != nullptr) {
3426         if (accountData->GetConfig()->GetDbHandle()->GetIntValue(SHORTCUT_ENABLED, INVALID_SHORTCUT_STATE) ==
3427             INVALID_SHORTCUT_STATE) {
3428             HILOG_INFO("Initialize the shortcut key state of PrivateSpace");
3429             shortKeyFlag = true;
3430         }
3431     } else if (accountData->GetAccountId() == DEFAULT_ACCOUNT_ID) {
3432         HILOG_INFO("Initialize the shortcut key state of MainSpace");
3433         shortKeyFlag = true;
3434     }
3435 
3436     if (shortKeyFlag) {
3437         accountData->GetConfig()->SetShortKeyState(true);
3438         std::vector<std::string> tmpVec { SCREEN_READER_BUNDLE_ABILITY_NAME };
3439         accountData->GetConfig()->SetShortkeyMultiTarget(tmpVec);
3440         UpdateConfigState();
3441         Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateShortKeyRegister();
3442     }
3443 }
3444 
RegisterProvisionCallback()3445 void AccessibleAbilityManagerService::RegisterProvisionCallback()
3446 {
3447     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3448     if (!accountData) {
3449         HILOG_ERROR("accountData is nullptr");
3450         return;
3451     }
3452 
3453     std::shared_ptr<AccessibilitySettingProvider> service =
3454         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3455     if (service == nullptr) {
3456         HILOG_ERROR("service is nullptr");
3457         return;
3458     }
3459     AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3460         Singleton<AccessibleAbilityManagerService>::GetInstance().OnDeviceProvisioned();
3461     };
3462     service->RegisterObserver(DEVICE_PROVISIONED, func);
3463     if (accountData->GetConfig()->GetDbHandle() != nullptr) {
3464         accountData->GetConfig()->GetDbHandle()->RegisterObserver(USER_SETUP_COMPLETED, func);
3465     }
3466 }
3467 
RegisterShortKeyEvent()3468 void AccessibleAbilityManagerService::RegisterShortKeyEvent()
3469 {
3470     HILOG_DEBUG();
3471     if (!handler_) {
3472         HILOG_ERROR("handler_ is nullptr");
3473         return;
3474     }
3475     handler_->PostTask([=]() {
3476         HILOG_DEBUG();
3477         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3478         if (!accountData) {
3479             HILOG_ERROR("accountData is nullptr");
3480             return;
3481         }
3482         std::shared_ptr<AccessibilitySettingProvider> service =
3483             AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3484         if (service == nullptr) {
3485             HILOG_ERROR("service is nullptr");
3486             return;
3487         }
3488         bool oobeState = false;
3489         bool userSetupState = false;
3490         service->GetBoolValue(DEVICE_PROVISIONED, oobeState, true);
3491         if (accountData->GetConfig()->GetDbHandle() != nullptr) {
3492             userSetupState = accountData->GetConfig()->GetDbHandle()->GetBoolValue(USER_SETUP_COMPLETED, false, true);
3493         }
3494         if (accountData->GetAccountId() == DEFAULT_ACCOUNT_ID && (oobeState == false || userSetupState == false)) {
3495             InitializeShortKeyState();
3496             RegisterProvisionCallback();
3497         } else if (accountData->GetAccountId() != DEFAULT_ACCOUNT_ID) {
3498             InitializeShortKeyState();
3499         }
3500         }, "REGISTER_SHORTKEY_OBSERVER");
3501 }
3502 
InitMagnification()3503 void AccessibleAbilityManagerService::InitMagnification()
3504 {
3505     HILOG_INFO();
3506     if (magnificationManager_ != nullptr) {
3507         HILOG_WARN("magnification already init.");
3508         return;
3509     }
3510     magnificationManager_ = std::make_shared<MagnificationManager>();
3511 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
3512     Singleton<AccessibilityDisplayManager>::GetInstance().RegisterDisplayListener(magnificationManager_);
3513 #endif
3514     SubscribeOsAccount();
3515 }
3516 
OffZoomGesture()3517 void AccessibleAbilityManagerService::OffZoomGesture()
3518 {
3519     HILOG_INFO();
3520     if (magnificationManager_ == nullptr) {
3521         HILOG_ERROR("magnificationManager_ is nullptr.");
3522         return;
3523     }
3524     magnificationManager_->DisableMagnification();
3525     magnificationManager_->ResetCurrentMode();
3526 }
3527 
OnScreenMagnificationStateChanged()3528 void AccessibleAbilityManagerService::OnScreenMagnificationStateChanged()
3529 {
3530     HILOG_DEBUG();
3531     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3532     if (accountData == nullptr) {
3533         HILOG_ERROR("accountData is nullptr");
3534         return;
3535     }
3536 
3537     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
3538     if (config == nullptr) {
3539         HILOG_ERROR("config is nullptr");
3540         return;
3541     }
3542 
3543     if (config->GetDbHandle() == nullptr) {
3544         HILOG_ERROR("datashareHelper is nullptr");
3545         return;
3546     }
3547 
3548     bool screenMagnificationEnabled = false;
3549     screenMagnificationEnabled = config->GetDbHandle()->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
3550     config->SetMagnificationState(screenMagnificationEnabled);
3551     Singleton<AccessibleAbilityManagerService>::GetInstance().UpdateInputFilter();
3552     if (!screenMagnificationEnabled) {
3553         OffZoomGesture();
3554     }
3555 }
3556 
RegisterScreenMagnificationState()3557 void AccessibleAbilityManagerService::RegisterScreenMagnificationState()
3558 {
3559     HILOG_DEBUG();
3560     if (handler_ == nullptr) {
3561         HILOG_ERROR("handler_ is nullptr");
3562         return;
3563     }
3564     handler_->PostTask([=]() {
3565         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3566         if (accountData == nullptr) {
3567             HILOG_ERROR("accountData is nullptr");
3568             return;
3569         }
3570 
3571         AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3572             Singleton<AccessibleAbilityManagerService>::GetInstance().OnScreenMagnificationStateChanged();
3573         };
3574         if (accountData->GetConfig()->GetDbHandle()) {
3575             accountData->GetConfig()->GetDbHandle()->RegisterObserver(SCREEN_MAGNIFICATION_KEY, func);
3576         }
3577         }, "REGISTER_SCREEN_ZOOM_OBSERVER");
3578 }
3579 
OnScreenMagnificationTypeChanged()3580 void AccessibleAbilityManagerService::OnScreenMagnificationTypeChanged()
3581 {
3582     HILOG_DEBUG();
3583     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3584     if (accountData == nullptr) {
3585         HILOG_ERROR("accountData is nullptr");
3586         return;
3587     }
3588 
3589     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
3590     if (config == nullptr) {
3591         HILOG_ERROR("config is nullptr");
3592         return;
3593     }
3594 
3595     if (config->GetDbHandle() == nullptr) {
3596         HILOG_ERROR("datashareHelper is nullptr");
3597         return;
3598     }
3599 
3600     uint32_t screenMagnificationType = 0;
3601     screenMagnificationType =
3602         static_cast<uint32_t>(config->GetDbHandle()->GetIntValue(SCREEN_MAGNIFICATION_TYPE, 0));
3603     config->SetScreenMagnificationType(screenMagnificationType);
3604     if (magnificationManager_ != nullptr) {
3605         magnificationManager_->OnMagnificationTypeChanged(screenMagnificationType);
3606     }
3607 }
3608 
RegisterScreenMagnificationType()3609 void AccessibleAbilityManagerService::RegisterScreenMagnificationType()
3610 {
3611     HILOG_DEBUG();
3612     if (handler_ == nullptr) {
3613         HILOG_ERROR("handler_ is nullptr");
3614         return;
3615     }
3616     handler_->PostTask([=]() {
3617         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3618         if (accountData == nullptr) {
3619             HILOG_ERROR("accountData is nullptr");
3620             return;
3621         }
3622 
3623         AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3624             Singleton<AccessibleAbilityManagerService>::GetInstance().OnScreenMagnificationTypeChanged();
3625         };
3626         if (accountData->GetConfig()->GetDbHandle()) {
3627             accountData->GetConfig()->GetDbHandle()->RegisterObserver(SCREEN_MAGNIFICATION_TYPE, func);
3628         }
3629         }, "REGISTER_SCREEN_ZOOM_TYPE_OBSERVER");
3630 }
3631 
UpdateVoiceRecognitionState()3632 void AccessibleAbilityManagerService::UpdateVoiceRecognitionState()
3633 {
3634     HILOG_INFO();
3635     {
3636         std::lock_guard<ffrt::mutex> lock(subscribeMSDPMutex_);
3637         if (isSubscribeMSDPCallback_) {
3638             MsdpManager::GetInstance().UnSubscribeVoiceRecognition();
3639             isSubscribeMSDPCallback_ = false;
3640             HILOG_INFO("userstatusClient.Unsubscribe");
3641         }
3642     }
3643     OnVoiceRecognitionChanged();
3644 }
3645 
OnVoiceRecognitionChanged()3646 void AccessibleAbilityManagerService::OnVoiceRecognitionChanged()
3647 {
3648     HILOG_INFO();
3649     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3650     if (accountData == nullptr) {
3651         HILOG_ERROR("accountData is nullptr");
3652         return;
3653     }
3654 
3655     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
3656     if (config == nullptr) {
3657         HILOG_ERROR("config is nullptr");
3658         return;
3659     }
3660 
3661     if (config->GetDbHandle() == nullptr) {
3662         HILOG_ERROR("datashareHelper is nullptr");
3663         return;
3664     }
3665 
3666     bool voiceRecognitionEnabled = config->GetDbHandle()->GetBoolValue(VOICE_RECOGNITION_KEY, false);
3667     std::string voiceRecognitionTypes = config->GetDbHandle()->GetStringValue(VOICE_RECOGNITION_TYPES, "DEFAULT");
3668 
3669     std::lock_guard<ffrt::mutex> lock(subscribeMSDPMutex_);
3670     if (!isSubscribeMSDPCallback_ && voiceRecognitionEnabled && voiceRecognitionTypes != "DEFAULT") {
3671         int32_t ret = MsdpManager::GetInstance().SubscribeVoiceRecognition();
3672         isSubscribeMSDPCallback_ = true;
3673         HILOG_INFO("SubscribeVoiceRecognition ret: %{public}d", ret);
3674         return;
3675     }
3676 
3677     if (isSubscribeMSDPCallback_ && (!voiceRecognitionEnabled || voiceRecognitionTypes == "DEFAULT")) {
3678         MsdpManager::GetInstance().UnSubscribeVoiceRecognition();
3679         isSubscribeMSDPCallback_ = false;
3680         return;
3681     }
3682 }
3683 
RegisterVoiceRecognitionState()3684 void AccessibleAbilityManagerService::RegisterVoiceRecognitionState()
3685 {
3686     HILOG_INFO();
3687     if (handler_ == nullptr) {
3688         HILOG_ERROR("handler_ is nullptr");
3689         return;
3690     }
3691     handler_->PostTask([=]() {
3692         sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3693         if (accountData == nullptr) {
3694             HILOG_ERROR("accountData is nullptr");
3695             return;
3696         }
3697 
3698         AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string &state) {
3699             Singleton<AccessibleAbilityManagerService>::GetInstance().OnVoiceRecognitionChanged();
3700         };
3701 
3702         if (accountData->GetConfig()->GetDbHandle()) {
3703             accountData->GetConfig()->GetDbHandle()->RegisterObserver(VOICE_RECOGNITION_KEY, func);
3704             accountData->GetConfig()->GetDbHandle()->RegisterObserver(VOICE_RECOGNITION_TYPES, func);
3705         }
3706         }, "REGISTER_VOICE_RECOGNITION");
3707 }
3708 
PostDelayUnloadTask()3709 void AccessibleAbilityManagerService::PostDelayUnloadTask()
3710 {
3711 #ifdef ACCESSIBILITY_WATCH_FEATURE
3712     auto task = [=]() {
3713         sptr<ISystemAbilityManager> systemAbilityManager =
3714             SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
3715         if (systemAbilityManager == nullptr) {
3716             HILOG_ERROR("failed to get system ability mgr");
3717             return;
3718         }
3719         if (!IsNeedUnload()) {
3720             Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
3721             return;
3722         }
3723         int32_t ret = systemAbilityManager->UnloadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
3724         if (ret != ERR_OK) {
3725             HILOG_ERROR("unload system ability failed");
3726             return;
3727         }
3728         SetParameter(SYSTEM_PARAMETER_AAMS_NAME, "false");
3729     };
3730     handler_->RemoveTask(DELAY_UNLOAD_TASK);
3731     handler_->PostTask(task, DELAY_UNLOAD_TASK, UNLOAD_TASK_INTERNAL);
3732 #endif
3733 }
3734 
IsNeedUnload()3735 bool AccessibleAbilityManagerService::IsNeedUnload()
3736 {
3737     HILOG_DEBUG();
3738 #ifndef ACCESSIBILITY_WATCH_FEATURE
3739     // always return true to avoid stablity problem
3740     return false;
3741 #else // for watch
3742     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3743     if (!accountData) {
3744         HILOG_ERROR("accountData is nullptr");
3745         return true;
3746     }
3747 
3748     // do not unload when any extension is enabled
3749     std::vector<std::string> enableAbilityList = accountData->GetEnabledAbilities();
3750     if (enableAbilityList.size() != 0) {
3751         return false;
3752     }
3753     return true;
3754 #endif // ACCESSIBILITY_WATCH_FEATURE
3755 }
3756 
GetTreeIdBySplitElementId(const int64_t elementId)3757 int32_t AccessibleAbilityManagerService::GetTreeIdBySplitElementId(const int64_t elementId)
3758 {
3759     if (elementId < 0) {
3760         HILOG_DEBUG("The elementId is -1");
3761         return elementId;
3762     }
3763     int32_t treeId = (static_cast<uint64_t>(elementId) >> ELEMENT_MOVE_BIT);
3764     return treeId;
3765 }
3766 
AddRequestId(int32_t windowId,int32_t treeId,int32_t requestId,sptr<IAccessibilityElementOperatorCallback> callback)3767 void AccessibleAbilityManagerService::AddRequestId(int32_t windowId, int32_t treeId, int32_t requestId,
3768     sptr<IAccessibilityElementOperatorCallback> callback)
3769 {
3770     std::lock_guard<ffrt::mutex> lock(mutex_);
3771     HILOG_DEBUG("Add windowId: %{public}d treeId: %{public}d requestId: %{public}d", windowId, treeId, requestId);
3772     if (!windowRequestIdMap_.count(windowId)) {
3773         windowRequestIdMap_[windowId] = {};
3774     }
3775     if (!windowRequestIdMap_[windowId].count(treeId)) {
3776         windowRequestIdMap_[windowId][treeId] = {};
3777     }
3778     if (!windowRequestIdMap_[windowId][treeId].count(requestId)) {
3779         windowRequestIdMap_[windowId][treeId].insert(requestId);
3780         requestIdMap_[requestId] = callback;
3781     }
3782 }
3783 
RemoveRequestId(int32_t requestId)3784 ErrCode AccessibleAbilityManagerService::RemoveRequestId(int32_t requestId)
3785 {
3786     std::lock_guard<ffrt::mutex> lock(mutex_);
3787     HILOG_DEBUG("RemoveRequestId requestId: %{public}d", requestId);
3788     for (auto &window : windowRequestIdMap_) {
3789         for (auto &tree : window.second) {
3790             auto it = tree.second.find(requestId);
3791             if (it != tree.second.end()) {
3792                 HILOG_DEBUG("tree.second.erase requestId:%{public}d", requestId);
3793                 tree.second.erase(it);
3794             }
3795             auto ite = requestIdMap_.find(requestId);
3796             if (ite != requestIdMap_.end()) {
3797                 HILOG_DEBUG("requestIdMap_.erase requestId:%{public}d", requestId);
3798                 requestIdMap_.erase(ite);
3799             }
3800         }
3801     }
3802     return ERR_OK;
3803 }
3804 
StopCallbackWait(int32_t windowId)3805 void AccessibleAbilityManagerService::StopCallbackWait(int32_t windowId)
3806 {
3807     HILOG_INFO("StopCallbackWait start windowId: %{public}d", windowId);
3808     if (!windowRequestIdMap_.count(windowId)) {
3809         HILOG_DEBUG("windowId not exists");
3810         return;
3811     }
3812     for (auto iter = windowRequestIdMap_[windowId].begin(); iter != windowRequestIdMap_[windowId].end(); ++iter) {
3813         HILOG_DEBUG("stop callback wait windowId: %{public}d, treeId: %{public}d", windowId, iter->first);
3814         StopCallbackWait(windowId, iter->first);
3815     }
3816 }
3817 
StopCallbackWait(int32_t windowId,int32_t treeId)3818 void AccessibleAbilityManagerService::StopCallbackWait(int32_t windowId, int32_t treeId)
3819 {
3820     std::lock_guard<ffrt::mutex> lock(mutex_);
3821     HILOG_DEBUG("StopCallbackWait start windowId: %{public}d treeId: %{public}d", windowId, treeId);
3822     if (!windowRequestIdMap_.count(windowId)) {
3823         return;
3824     }
3825     if (!windowRequestIdMap_[windowId].count(treeId)) {
3826         return;
3827     }
3828     auto requestIds = windowRequestIdMap_[windowId][treeId];
3829     for (auto requestId = requestIds.begin(); requestId != requestIds.end();) {
3830         HILOG_DEBUG("stop callback wait windowId: %{public}d, requestId: %{public}d", windowId, *requestId);
3831         auto iter = requestIdMap_.find(*requestId);
3832         if (iter != requestIdMap_.end()) {
3833             HILOG_DEBUG("requestIdMap_ set callback and erase requestId:%{public}d", *requestId);
3834             sptr<IAccessibilityElementOperatorCallback> callback = requestIdMap_[*requestId];
3835             if (callback != nullptr) {
3836                 callback->SetExecuteActionResult(false, *requestId);
3837             }
3838             requestIdMap_.erase(iter);
3839         }
3840         requestId = requestIds.erase(requestId);
3841     }
3842 }
3843 
GetRootParentId(int32_t windowId,int32_t treeId,int64_t & parentId)3844 ErrCode AccessibleAbilityManagerService::GetRootParentId(int32_t windowId, int32_t treeId, int64_t &parentId)
3845 {
3846     HILOG_INFO("aa search treeParent from aams,  windowId: %{public}d, treeId: %{public}d", windowId, treeId);
3847     sptr<AccessibilityWindowConnection> connection = GetAccessibilityWindowConnection(windowId);
3848     if (!connection) {
3849         HILOG_WARN("The operator of windowId[%{public}d] has not been registered.", windowId);
3850         return RET_ERR_NO_CONNECTION;
3851     }
3852     connection->GetRootParentId(treeId, parentId);
3853     return ERR_OK;
3854 }
3855 
GetRootParentId(int32_t windowId,int32_t treeId,int64_t & parentId,bool systemApi)3856 ErrCode AccessibleAbilityManagerService::GetRootParentId(
3857     int32_t windowId, int32_t treeId, int64_t& parentId, bool systemApi)
3858 {
3859     if (systemApi && !CheckPermission(OHOS_PERMISSION_ACCESSIBILITY_EXTENSION_ABILITY)) {
3860         HILOG_WARN("GetRootParentId permission denied.");
3861         return RET_ERR_NO_PERMISSION;
3862     }
3863     return GetRootParentId(windowId, treeId, parentId);
3864 }
3865 
GenerateRequestId()3866 int32_t AccessibleAbilityManagerService::GenerateRequestId()
3867 {
3868     int32_t requestId = requestId_.fetch_add(1, std::memory_order_relaxed);
3869     if (requestId == REQUEST_ID_MAX) {
3870         requestId_ = REQUEST_ID_MIN;
3871         requestId = requestId_.fetch_add(1, std::memory_order_relaxed);
3872     }
3873     return requestId;
3874 }
3875 
CheckCallingUid()3876 RetError AccessibleAbilityManagerService::CheckCallingUid()
3877 {
3878     int32_t accountId = Utils::GetUserIdByCallingUid();
3879     if (accountId != currentAccountId_ && accountId != ROOT_UID) {
3880         HILOG_WARN("accountId is diff from currentAccountId_.");
3881         return RET_ERR_SAMGR;
3882     }
3883     return RET_OK;
3884 }
3885 
OnDataClone()3886 void AccessibleAbilityManagerService::OnDataClone()
3887 {
3888     std::shared_ptr<AccessibilitySettingProvider> service =
3889         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
3890     if (service == nullptr) {
3891         HILOG_ERROR("service is nullptr");
3892         return;
3893     }
3894     bool cloneState = false;
3895     service->GetBoolValue(ACCESSIBILITY_CLONE_FLAG, cloneState);
3896     if (cloneState == false) {
3897         return;
3898     }
3899     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
3900     if (accountData == nullptr) {
3901         HILOG_WARN("accountData is nullptr.");
3902         return;
3903     }
3904     if (accountData->GetConfig() != nullptr) {
3905         accountData->GetConfig()->OnDataClone();
3906         UpdateAllSetting();
3907         UpdateAutoStartAbilities();
3908         UpdateInputFilter();
3909         UpdateVoiceRecognitionState();
3910         HILOG_INFO("accessibility reload config.");
3911     } else {
3912         HILOG_WARN("config_ is nullptr");
3913     }
3914 }
3915 
GetResourceBundleInfo(AccessibilityEventInfo & eventInfo)3916 RetError AccessibleAbilityManagerService::GetResourceBundleInfo(AccessibilityEventInfo &eventInfo)
3917 {
3918     HILOG_DEBUG("BundleName is %{public}s, ModuleName is %{public}s, ResourceId is %{public}d",
3919         eventInfo.GetResourceBundleName().c_str(), eventInfo.GetResourceModuleName().c_str(),
3920         eventInfo.GetResourceId());
3921     sptr<AccessibilityAccountData> accountData =
3922         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
3923     if (accountData == nullptr) {
3924         HILOG_ERROR("get accountData failed");
3925         return RET_ERR_NULLPTR;
3926     }
3927     int32_t userId = accountData->GetAccountId();
3928 
3929     AppExecFwk::BundleInfo bundleInfo;
3930     ErrCode ret =
3931         Singleton<AccessibilityResourceBundleManager>::GetInstance().GetBundleInfoV9(eventInfo.GetResourceBundleName(),
3932         static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE), bundleInfo, userId);
3933     if (ret != ERR_OK) {
3934         HILOG_ERROR("get BundleInfo failed!");
3935         return RET_ERR_FAILED;
3936     }
3937 
3938     std::string resourceValue;
3939     RetError res = GetResourceValue(eventInfo, bundleInfo, userId, resourceValue);
3940     if (res != RET_OK) {
3941         HILOG_ERROR("Get Resource Value failed");
3942         return res;
3943     }
3944     HILOG_DEBUG("resource value is %{public}s", resourceValue.c_str());
3945     eventInfo.SetTextAnnouncedForAccessibility(resourceValue);
3946     return RET_OK;
3947 }
3948 
GetResourceValue(AccessibilityEventInfo & eventInfo,AppExecFwk::BundleInfo bundleInfo,int32_t userId,std::string & result)3949 RetError AccessibleAbilityManagerService::GetResourceValue(AccessibilityEventInfo &eventInfo,
3950     AppExecFwk::BundleInfo bundleInfo, int32_t userId, std::string &result)
3951 {
3952     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
3953     if (resConfig == nullptr) {
3954         HILOG_ERROR("create resConfig failed");
3955         return RET_ERR_NULLPTR;
3956     }
3957     UErrorCode status = U_ZERO_ERROR;
3958     icu::Locale locale = icu::Locale::forLanguageTag(Global::I18n::LocaleConfig::GetSystemLanguage(), status);
3959     resConfig->SetLocaleInfo(locale.getLanguage(), locale.getScript(), locale.getCountry());
3960 
3961     std::string hapPath;
3962     std::vector<std::string> overlayPaths;
3963     int32_t appType = 0;
3964     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager(
3965         eventInfo.GetResourceBundleName(), eventInfo.GetResourceModuleName(), hapPath, overlayPaths, *resConfig,
3966         appType, userId));
3967     if (resourceManager == nullptr) {
3968         HILOG_ERROR("create Resource manager failed");
3969         return RET_ERR_NULLPTR;
3970     }
3971 
3972     Global::Resource::RState state = resourceManager->UpdateResConfig(*resConfig);
3973     if (state != Global::Resource::RState::SUCCESS) {
3974         HILOG_ERROR("UpdateResConfig failed! errCode: %{public}d", state);
3975         return RET_ERR_FAILED;
3976     }
3977 
3978     for (const auto &hapModuleInfo : bundleInfo.hapModuleInfos) {
3979         std::string moduleResPath = hapModuleInfo.hapPath.empty() ? hapModuleInfo.resourcePath : hapModuleInfo.hapPath;
3980         HILOG_DEBUG("hapModuleInfo.hapPath is %{public}s", hapModuleInfo.hapPath.c_str());
3981         if (moduleResPath.empty()) {
3982             HILOG_ERROR("moduleResPath is empty");
3983             continue;
3984         }
3985         if (!resourceManager->AddResource(moduleResPath.c_str())) {
3986             HILOG_ERROR("AddResource is failed");
3987         }
3988     }
3989 
3990     Global::Resource::RState res = resourceManager->GetStringById(eventInfo.GetResourceId(), result);
3991     if (res != Global::Resource::RState::SUCCESS) {
3992         HILOG_ERROR("get resource value failed");
3993         return RET_ERR_FAILED;
3994     }
3995     return RET_OK;
3996 }
3997 
GetCurrentAcountDatashareHelper()3998 std::shared_ptr<AccessibilityDatashareHelper> AccessibleAbilityManagerService::GetCurrentAcountDatashareHelper()
3999 {
4000     HILOG_DEBUG();
4001     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4002     if (accountData == nullptr) {
4003         HILOG_ERROR("accountData is nullptr");
4004         return nullptr;
4005     }
4006 
4007     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4008     if (config == nullptr) {
4009         HILOG_ERROR("config is nullptr");
4010         return nullptr;
4011     }
4012 
4013     return config->GetDbHandle();
4014 }
4015 
GetMagnificationState()4016 bool AccessibleAbilityManagerService::GetMagnificationState()
4017 {
4018     HILOG_DEBUG();
4019     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4020     if (accountData == nullptr) {
4021         HILOG_ERROR("accountData is nullptr");
4022         return false;
4023     }
4024 
4025     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4026     if (config == nullptr) {
4027         HILOG_ERROR("config is nullptr");
4028         return false;
4029     }
4030     return config->GetScreenMagnificationState();
4031 }
4032 
GetMagnificationType()4033 uint32_t AccessibleAbilityManagerService::GetMagnificationType()
4034 {
4035     HILOG_DEBUG();
4036     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4037     if (accountData == nullptr) {
4038         HILOG_ERROR("accountData is nullptr");
4039         return 0;
4040     }
4041 
4042     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4043     if (config == nullptr) {
4044         HILOG_ERROR("config is nullptr");
4045         return 0;
4046     }
4047     return config->GetScreenMagnificationType();
4048 }
4049 
GetMagnificationMode()4050 uint32_t AccessibleAbilityManagerService::GetMagnificationMode()
4051 {
4052     HILOG_DEBUG();
4053     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4054     if (accountData == nullptr) {
4055         HILOG_ERROR("accountData is nullptr");
4056         return 0;
4057     }
4058 
4059     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4060     if (config == nullptr) {
4061         HILOG_ERROR("config is nullptr");
4062         return 0;
4063     }
4064     return config->GetScreenMagnificationMode();
4065 }
4066 
SetMagnificationMode(int32_t mode)4067 void AccessibleAbilityManagerService::SetMagnificationMode(int32_t mode)
4068 {
4069     HILOG_DEBUG();
4070     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4071     if (accountData == nullptr) {
4072         HILOG_ERROR("accountData is nullptr");
4073         return;
4074     }
4075 
4076     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4077     if (config == nullptr) {
4078         HILOG_ERROR("config is nullptr");
4079         return;
4080     }
4081     config->SetScreenMagnificationMode(mode);
4082 
4083     shared_ptr<AccessibilityDatashareHelper> helper = GetCurrentAcountDatashareHelper();
4084     if (helper == nullptr) {
4085         HILOG_ERROR("datashareHelper is nullptr");
4086         return;
4087     }
4088 
4089     helper->PutIntValue(SCREEN_MAGNIFICATION_MODE, mode, false);
4090 }
4091 
GetMagnificationScale()4092 float AccessibleAbilityManagerService::GetMagnificationScale()
4093 {
4094     HILOG_DEBUG();
4095     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4096     if (accountData == nullptr) {
4097         HILOG_ERROR("accountData is nullptr");
4098         return DEFAULT_SCALE;
4099     }
4100 
4101     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4102     if (config == nullptr) {
4103         HILOG_ERROR("config is nullptr");
4104         return DEFAULT_SCALE;
4105     }
4106     return config->GetScreenMagnificationScale();
4107 }
4108 
SetMagnificationScale(float scale)4109 void AccessibleAbilityManagerService::SetMagnificationScale(float scale)
4110 {
4111     HILOG_DEBUG();
4112     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4113     if (accountData == nullptr) {
4114         HILOG_ERROR("accountData is nullptr");
4115         return;
4116     }
4117 
4118     std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
4119     if (config == nullptr) {
4120         HILOG_ERROR("config is nullptr");
4121         return;
4122     }
4123     config->SetScreenMagnificationScale(scale);
4124 
4125     shared_ptr<AccessibilityDatashareHelper> helper = GetCurrentAcountDatashareHelper();
4126     if (helper == nullptr) {
4127         HILOG_ERROR("datashareHelper is nullptr");
4128         return;
4129     }
4130     helper->PutFloatValue(SCREEN_MAGNIFICATION_SCALE, scale, false);
4131 }
4132 
GetMagnificationMgr()4133 std::shared_ptr<MagnificationManager> AccessibleAbilityManagerService::GetMagnificationMgr()
4134 {
4135     HILOG_DEBUG();
4136     return magnificationManager_;
4137 }
4138 
GetWindowMagnificationManager()4139 std::shared_ptr<WindowMagnificationManager> AccessibleAbilityManagerService::GetWindowMagnificationManager()
4140 {
4141     HILOG_DEBUG();
4142     if (magnificationManager_ == nullptr) {
4143         HILOG_ERROR("magnificationManager_ is nullptr.");
4144         return nullptr;
4145     }
4146     return magnificationManager_->GetWindowMagnificationManager();
4147 }
4148 
GetFullScreenMagnificationManager()4149 std::shared_ptr<FullScreenMagnificationManager> AccessibleAbilityManagerService::GetFullScreenMagnificationManager()
4150 {
4151     HILOG_DEBUG();
4152     if (magnificationManager_ == nullptr) {
4153         HILOG_ERROR("magnificationManager_ is nullptr.");
4154         return nullptr;
4155     }
4156     return magnificationManager_->GetFullScreenMagnificationManager();
4157 }
4158 
GetMenuManager()4159 std::shared_ptr<MagnificationMenuManager> AccessibleAbilityManagerService::GetMenuManager()
4160 {
4161     HILOG_DEBUG();
4162     if (magnificationManager_ == nullptr) {
4163         HILOG_ERROR("magnificationManager_ is nullptr.");
4164         return nullptr;
4165     }
4166     return magnificationManager_->GetMenuManager();
4167 }
4168 
OnModeChanged(uint32_t mode)4169 void AccessibleAbilityManagerService::OnModeChanged(uint32_t mode)
4170 {
4171     HILOG_DEBUG();
4172     if (magnificationManager_ == nullptr) {
4173         HILOG_ERROR("magnificationManager_ is nullptr.");
4174         return;
4175     }
4176     return magnificationManager_->OnModeChanged(mode);
4177 }
4178 
SetEnhanceConfig(const AccessibilitySecCompRawdata & rawData)4179 int32_t AccessibleAbilityManagerService::SetEnhanceConfig(const AccessibilitySecCompRawdata& rawData)
4180 {
4181     HILOG_INFO();
4182     int32_t result = AccessibilitySecurityComponentManager::SetEnhanceConfig(rawData);
4183     return result;
4184 }
4185 
OnFocusedEvent(const AccessibilityEventInfo & eventInfo)4186 void AccessibleAbilityManagerService::OnFocusedEvent(const AccessibilityEventInfo &eventInfo)
4187 {
4188     if (magnificationManager_ == nullptr) {
4189         return;
4190     }
4191     if (!magnificationManager_->GetMagnificationState()) {
4192         return;
4193     }
4194     if (eventInfo.GetEventType() != TYPE_VIEW_ACCESSIBILITY_FOCUSED_EVENT) {
4195         return;
4196     }
4197     Rect rect = eventInfo.GetElementInfo().GetRectInScreen();
4198     int32_t centerX = static_cast<int32_t>((rect.GetLeftTopXScreenPostion() +
4199         rect.GetRightBottomXScreenPostion()) / static_cast<float>(DIVISOR_TWO));
4200     int32_t centerY = static_cast<int32_t>((rect.GetLeftTopYScreenPostion() +
4201         rect.GetRightBottomYScreenPostion()) / static_cast<float>(DIVISOR_TWO));
4202 
4203     magnificationManager_->FollowFocuseElement(centerX, centerY);
4204 }
4205 
InitResource(bool needReInit)4206 void AccessibleAbilityManagerService::InitResource(bool needReInit)
4207 {
4208     if (isResourceInit_ && !needReInit) {
4209         HILOG_WARN("already init.");
4210         return;
4211     }
4212     std::shared_ptr<Global::Resource::ResourceManager> resourceManager(Global::Resource::CreateResourceManager());
4213     if (resourceManager == nullptr) {
4214         HILOG_ERROR("resourceManager is null");
4215         return;
4216     }
4217     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
4218     if (resConfig == nullptr) {
4219         HILOG_ERROR("resConfig is null");
4220         return;
4221     }
4222     std::map<std::string, std::string> configs;
4223     OHOS::Global::I18n::LocaleInfo locale(Global::I18n::LocaleConfig::GetSystemLocale(), configs);
4224     std::string language = locale.GetLanguage();
4225     std::string script = locale.GetScript();
4226     std::string region = locale.GetRegion();
4227 
4228     resConfig->SetLocaleInfo(language.c_str(), script.c_str(), region.c_str());
4229     resourceManager->UpdateResConfig(*resConfig);
4230     if (!resourceManager->AddResource(HAP_PATH)) {
4231         HILOG_ERROR("AddResource failed");
4232         return;
4233     }
4234     for (auto &iter : ResourceMap) {
4235         std::string outValue;
4236         if (iter.first == MAGNIFICATION_SCALE) {
4237             resourceManager->GetPluralStringByName(iter.first.c_str(), QUANTITY, outValue);
4238         } else {
4239             resourceManager->GetStringByName(iter.first.c_str(), outValue);
4240         }
4241         ResourceMap[iter.first] = outValue;
4242     }
4243     isResourceInit_ = true;
4244 }
4245 
GetResource(const std::string & resourceName)4246 std::string &AccessibleAbilityManagerService::GetResource(const std::string &resourceName)
4247 {
4248     return ResourceMap[resourceName];
4249 }
4250 
AnnouncedForAccessibility(const std::string & announcedText)4251 ErrCode AccessibleAbilityManagerService::AnnouncedForAccessibility(const std::string &announcedText)
4252 {
4253     HILOG_DEBUG();
4254     AccessibilityEventInfo event(TYPE_VIEW_ANNOUNCE_FOR_ACCESSIBILITY);
4255     event.SetBundleName(HAP_BUNDLE);
4256     event.SetTriggerAction(ACCESSIBILITY_ACTION_COMMON);
4257     event.SetTextAnnouncedForAccessibility(announcedText);
4258     AccessibilityEventInfoParcel eventParcel(event);
4259     return SendEvent(eventParcel, 0);
4260 }
4261 
AnnouncedForMagnification(AnnounceType announceType)4262 void AccessibleAbilityManagerService::AnnouncedForMagnification(AnnounceType announceType)
4263 {
4264     bool state = false;
4265     GetScreenReaderState(state);
4266     if (!state) {
4267         HILOG_ERROR("screenReader not enable.");
4268         return;
4269     }
4270     std::string resource = "";
4271     if (announceType == AnnounceType::ANNOUNCE_MAGNIFICATION_SCALE) {
4272         resource = GetResource(MAGNIFICATION_SCALE).c_str();
4273         std::ostringstream oss;
4274         float scale = GetMagnificationScale();
4275         oss << std::fixed << std::setprecision(1) << scale;
4276         std::string scaleStr = oss.str();
4277         std::string announceStr = Utils::FormatString(resource, scaleStr);
4278         AnnouncedForAccessibility(announceStr);
4279         return;
4280     }
4281 
4282     if (announceType == AnnounceType::ANNOUNCE_MAGNIFICATION_DISABLE) {
4283         resource = GetResource(MAGNIFICATION_DISABLE).c_str();
4284         AnnouncedForAccessibility(resource);
4285         return;
4286     }
4287 
4288     if (announceType == AnnounceType::ANNOUNCE_SWITCH_FULL_SCREEN) {
4289         resource = GetResource(SWITCH_FULL_SCREEN).c_str();
4290         AnnouncedForAccessibility(resource);
4291         return;
4292     }
4293 
4294     if (announceType == AnnounceType::ANNOUNCE_SWITCH_WINDOW) {
4295         resource = GetResource(SWITCH_WINDOW).c_str();
4296         AnnouncedForAccessibility(resource);
4297         return;
4298     }
4299 }
4300 
UpdateUITestConfigureEvents(std::vector<uint32_t> needEvents)4301 RetError AccessibleAbilityManagerService::UpdateUITestConfigureEvents(std::vector<uint32_t> needEvents)
4302 {
4303     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4304     if (!accountData) {
4305         HILOG_ERROR("Account data is null");
4306         return RET_ERR_NULLPTR;
4307     }
4308 
4309     std::string uiTestUri = Utils::GetUri(UI_TEST_BUNDLE_NAME, UI_TEST_ABILITY_NAME);
4310     accountData->AddNeedEvent(uiTestUri, needEvents);
4311     uint32_t state = accountData->GetAccessibilityState();
4312     state |= STATE_CONFIG_EVENT_CHANGE;
4313     stateObservers_.OnStateObservers(state);
4314     return RET_OK;
4315 }
4316 
SearchNeedEvents(std::vector<uint32_t> & needEvents)4317 ErrCode AccessibleAbilityManagerService::SearchNeedEvents(std::vector<uint32_t> &needEvents)
4318 {
4319     HILOG_DEBUG("SearchNeedEvents AAMS");
4320     sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
4321     if (!accountData) {
4322         HILOG_ERROR("Account data is null");
4323         return ERR_INVALID_VALUE;
4324     }
4325     needEvents = accountData->GetNeedEvents();
4326     HILOG_DEBUG("GetNeedEvent size is %{public}zu", needEvents.size());
4327     return NO_ERROR;
4328 }
4329 
SubscribeOsAccount()4330 void AccessibleAbilityManagerService::SubscribeOsAccount()
4331 {
4332     HILOG_INFO();
4333     if (accountSubscriber_ != nullptr) {
4334         HILOG_ERROR("accountSubscriber is already registed!");
4335         return;
4336     }
4337     std::set<AccountSA::OsAccountState> states;
4338     states.insert(AccountSA::OsAccountState::SWITCHING);
4339     AccountSA::OsAccountSubscribeInfo info(states, false);
4340     accountSubscriber_ = std::make_shared<AccountSubscriber>(info);
4341     if (accountSubscriber_ == nullptr) {
4342         HILOG_ERROR("create accountSubscriber fail!");
4343         return;
4344     }
4345     auto result = AccountSA::OsAccountManager::SubscribeOsAccount(accountSubscriber_);
4346     if (result != ERR_OK) {
4347         HILOG_ERROR("fail to register subscriber, res:%{public}d.", result);
4348     }
4349 }
4350 
UnsubscribeOsAccount()4351 void AccessibleAbilityManagerService::UnsubscribeOsAccount()
4352 {
4353     if (accountSubscriber_ == nullptr) {
4354         HILOG_ERROR("accountSubscriber is nullptr.");
4355         return;
4356     }
4357     auto res = AccountSA::OsAccountManager::UnsubscribeOsAccount(accountSubscriber_);
4358     if (res != ERR_OK) {
4359         HILOG_ERROR("unregister account event fail res:%{public}d", res);
4360     }
4361 }
4362 } // namespace Accessibility
4363 } // namespace OHOS