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