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 ¶meter,
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