From 3386bc3c058f6d3d944061f5be831798d375d67b Mon Sep 17 00:00:00 2001 From: he-pian <2810516108@qq.com> Date: Thu, 22 Aug 2024 14:18:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0accessibility=E6=8C=89?= =?UTF-8?q?=E9=9C=80=E5=90=AF=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/accessible_ability_client_impl.h | 3 +- .../src/accessible_ability_client_impl.cpp | 70 +++- .../acfwk/include/accessibility_config_impl.h | 1 + .../acfwk/src/accessibility_config_impl.cpp | 330 +++++++++++++----- ...accessibility_system_ability_client_impl.h | 2 +- ...cessibility_system_ability_client_impl.cpp | 87 +++-- sa_profile/801.json | 2 +- sa_profile/accessibility.cfg | 6 +- 8 files changed, 366 insertions(+), 135 deletions(-) diff --git a/frameworks/aafwk/include/accessible_ability_client_impl.h b/frameworks/aafwk/include/accessible_ability_client_impl.h index a7a3191d..c0c8d1e2 100644 --- a/frameworks/aafwk/include/accessible_ability_client_impl.h +++ b/frameworks/aafwk/include/accessible_ability_client_impl.h @@ -300,7 +300,7 @@ public: * @param state Connnection state. */ void SetConnectionState(bool state); - + sptr LoadAccessibilityService(); void AddWindowElementMapByWMS(int32_t windowId, int64_t elementId); void AddWindowElementMapByAce(int32_t windowId, int64_t elementId); RetError GetElementInfoFromCache(int32_t windowId, int64_t elementId, @@ -366,7 +366,6 @@ private: private: AccessibleAbilityClientImpl &client_; }; - bool GetCacheElementInfo(const int32_t windowId, const int64_t elementId, AccessibilityElementInfo &elementInfo) const; void SetCacheElementInfo(const int32_t windowId, diff --git a/frameworks/aafwk/src/accessible_ability_client_impl.cpp b/frameworks/aafwk/src/accessible_ability_client_impl.cpp index 8301bf20..a97b3ca6 100644 --- a/frameworks/aafwk/src/accessible_ability_client_impl.cpp +++ b/frameworks/aafwk/src/accessible_ability_client_impl.cpp @@ -35,6 +35,7 @@ namespace { constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10; constexpr int64_t ROOT_NONE_ID = -1; constexpr int64_t NODE_ID_MAX = 0x7FFFFFFE; + constexpr int32_t LOAD_ABILITY_TIME_OUT_SECONDS = 3; std::mutex g_Mutex; sptr g_Instance = nullptr; } // namespace @@ -105,15 +106,21 @@ bool AccessibleAbilityClientImpl::InitAccessibilityServiceProxy() sptr object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID); if (!object) { - HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); - return false; + object = LoadAccessibilityService(); + if (!object) { + HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); + return false; + } } HILOG_DEBUG("Get remote object ok"); serviceProxy_ = iface_cast(object); if (!serviceProxy_) { - HILOG_ERROR("Get aams proxy failed"); - return false; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return RET_ERR_SAMGR; + } } // Add death recipient @@ -375,8 +382,11 @@ RetError AccessibleAbilityClientImpl::GetRoot(AccessibilityElementInfo &elementI std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to connect to aams"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return RET_ERR_SAMGR; + } } if (!channelClient_) { @@ -450,8 +460,11 @@ RetError AccessibleAbilityClientImpl::GetRootBatch(std::vectorGetActiveWindow(); @@ -527,8 +540,11 @@ RetError AccessibleAbilityClientImpl::GetRootByWindowBatch(const AccessibilityWi std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("failed to connect to aams"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return RET_ERR_SAMGR; + } } if (!channelClient_) { @@ -813,8 +829,11 @@ void AccessibleAbilityClientImpl::NotifyServiceDied(const wptr &r { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("serviceProxy_ is nullptr"); - return; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return; + } } sptr object = serviceProxy_->AsObject(); if (object && (remote == object)) { @@ -928,8 +947,11 @@ RetError AccessibleAbilityClientImpl::Connect() HILOG_DEBUG(); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return RET_ERR_SAMGR; + } } return serviceProxy_->EnableUITestAbility(this->AsObject()); @@ -940,8 +962,11 @@ RetError AccessibleAbilityClientImpl::Disconnect() HILOG_DEBUG(); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get aams service"); + return RET_ERR_SAMGR; + } } return serviceProxy_->DisableUITestAbility(); } @@ -1247,5 +1272,18 @@ void AccessibleAbilityClientImpl::SceneBoardWindowElementMap::RemovePairByWindow std::lock_guard lock(mapMutex_); windowElementMap_.erase(windowId); } + +sptr AccessibleAbilityClientImpl::LoadAccessibilityService() +{ + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (samgr == nullptr) { + return nullptr; + } + sptr object = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, LOAD_ABILITY_TIME_OUT_SECONDS); + if (object) { + serviceProxy_ = iface_cast(object); + } + return object; +} } // namespace Accessibility } // namespace OHOS \ No newline at end of file diff --git a/frameworks/acfwk/include/accessibility_config_impl.h b/frameworks/acfwk/include/accessibility_config_impl.h index 0ba6587a..2c404275 100644 --- a/frameworks/acfwk/include/accessibility_config_impl.h +++ b/frameworks/acfwk/include/accessibility_config_impl.h @@ -267,6 +267,7 @@ private: static void OnParameterChanged(const char *key, const char *value, void *context); void OnIgnoreRepeatClickStateChanged(const uint32_t stateType); + sptr LoadAccessibilityService(); sptr serviceProxy_ = nullptr; sptr captionObserver_ = nullptr; diff --git a/frameworks/acfwk/src/accessibility_config_impl.cpp b/frameworks/acfwk/src/accessibility_config_impl.cpp index dc793119..7347b3ff 100644 --- a/frameworks/acfwk/src/accessibility_config_impl.cpp +++ b/frameworks/acfwk/src/accessibility_config_impl.cpp @@ -24,6 +24,7 @@ namespace OHOS { namespace AccessibilityConfig { namespace { const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready"; + constexpr int32_t LOAD_ABILITY_TIME_OUT_SECONDS = 3; constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10; } // namespace @@ -110,8 +111,11 @@ bool AccessibilityConfig::Impl::ConnectToServiceAsync() bool AccessibilityConfig::Impl::RegisterToService() { if (!serviceProxy_) { - HILOG_ERROR("Service is not connected"); - return false; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } if (captionObserver_ && enableAbilityListsObserver_ && configObserver_) { @@ -173,10 +177,12 @@ bool AccessibilityConfig::Impl::InitAccessibilityServiceProxy() sptr object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID); if (!object) { - HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); - return false; + object = LoadAccessibilityService(); + if (!object) { + HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); + return false; + } } - if (!deathRecipient_) { deathRecipient_ = new(std::nothrow) DeathRecipient(*this); if (!deathRecipient_) { @@ -192,8 +198,11 @@ bool AccessibilityConfig::Impl::InitAccessibilityServiceProxy() serviceProxy_ = iface_cast(object); if (!serviceProxy_) { - HILOG_ERROR("IAccessibleAbilityManagerService iface_cast failed"); - return false; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } HILOG_DEBUG("InitAccessibilityServiceProxy success"); @@ -222,8 +231,11 @@ Accessibility::RetError AccessibilityConfig::Impl::EnableAbility(const std::stri HILOG_INFO("name = [%{private}s] capabilities = [%{private}u]", name.c_str(), capabilities); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->EnableAbility(name, capabilities); } @@ -233,8 +245,11 @@ Accessibility::RetError AccessibilityConfig::Impl::DisableAbility(const std::str HILOG_INFO("name = [%{private}s]", name.c_str()); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->DisableAbility(name); } @@ -243,8 +258,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsState(bool &state) { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetCaptionState(state); HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); @@ -255,8 +273,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsProperty(CaptionPr { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetCaptionProperty(caption); HILOG_INFO(); @@ -268,8 +289,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsProperty(const Cap HILOG_INFO(); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetCaptionProperty(caption); } @@ -279,8 +303,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsState(const bool s HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetCaptionState(state); } @@ -391,8 +418,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetScreenMagnificationState(c HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetScreenMagnificationState(state); } @@ -402,8 +432,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetShortKeyState(const bool s HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetShortKeyState(state); } @@ -413,8 +446,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetMouseKeyState(const bool s HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetMouseKeyState(state); } @@ -423,8 +459,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetScreenMagnificationState(b { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetScreenMagnificationState(state); @@ -436,8 +475,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetShortKeyState(bool &state) { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetShortKeyState(state); @@ -449,8 +491,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetMouseKeyState(bool &state) { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetMouseKeyState(state); @@ -783,8 +828,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetMouseAutoClick(const int32 HILOG_INFO("time = [%{public}d]", time); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetMouseAutoClick(time); } @@ -794,8 +842,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetShortkeyTarget(const std:: HILOG_INFO("name = [%{public}s]", name.c_str()); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetShortkeyTarget(name); } @@ -805,8 +856,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetShortkeyMultiTarget(const HILOG_INFO("start"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetShortkeyMultiTarget(name); } @@ -815,8 +869,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetMouseAutoClick(int32_t &ti { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetMouseAutoClick(time); @@ -828,8 +885,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyTarget(std::string { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetShortkeyTarget(name); @@ -841,8 +901,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyMultiTarget(std::v { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetShortkeyMultiTarget(name); @@ -1011,8 +1074,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetHighContrastTextState(cons HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetHighContrastTextState(state); } @@ -1022,8 +1088,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetInvertColorState(const boo HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetInvertColorState(state); } @@ -1033,8 +1102,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetDaltonizationState(const b HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetDaltonizationState(state); } @@ -1044,8 +1116,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetDaltonizationColorFilter(c HILOG_INFO("type = [%{public}u]", static_cast(type)); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetDaltonizationColorFilter(type); } @@ -1055,8 +1130,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetContentTimeout(const uint3 HILOG_INFO("timer = [%{public}u]", timer); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetContentTimeout(timer); } @@ -1066,8 +1144,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetAnimationOffState(const bo HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetAnimationOffState(state); } @@ -1077,8 +1158,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetBrightnessDiscount(const f HILOG_INFO("brightness = [%{public}f]", brightness); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetBrightnessDiscount(brightness); } @@ -1088,8 +1172,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetAudioMonoState(const bool HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetAudioMonoState(state); } @@ -1099,8 +1186,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetAudioBalance(const float b HILOG_INFO("balance = [%{public}f]", balance); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetAudioBalance(balance); } @@ -1110,8 +1200,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetClickResponseTime(const CL HILOG_INFO("click response time = [%{public}u]", time); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetClickResponseTime(time); } @@ -1121,8 +1214,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetIgnoreRepeatClickState(con HILOG_INFO("state = [%{public}s]", state ? "True" : "False"); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetIgnoreRepeatClickState(state); } @@ -1132,8 +1228,11 @@ Accessibility::RetError AccessibilityConfig::Impl::SetIgnoreRepeatClickTime(cons HILOG_INFO("ignore repeat click time = [%{public}u]", time); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SetIgnoreRepeatClickTime(time); } @@ -1142,8 +1241,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetInvertColorState(bool &sta { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetInvertColorState(state); @@ -1155,8 +1257,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetHighContrastTextState(bool { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetHighContrastTextState(state); @@ -1168,8 +1273,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationState(bool &s { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetDaltonizationState(state); @@ -1181,8 +1289,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationColorFilter(D { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } uint32_t filterType = 0; @@ -1196,8 +1307,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetContentTimeout(uint32_t &t { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetContentTimeout(timer); @@ -1209,8 +1323,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAnimationOffState(bool &st { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetAnimationOffState(state); @@ -1222,8 +1339,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetBrightnessDiscount(float & { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetBrightnessDiscount(brightness); @@ -1235,8 +1355,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAudioMonoState(bool &state { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetAudioMonoState(state); @@ -1248,8 +1371,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAudioBalance(float &balanc { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetAudioBalance(balance); @@ -1261,8 +1387,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetClickResponseTime(CLICK_RE { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } uint32_t responseTime = 0; @@ -1276,8 +1405,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetIgnoreRepeatClickState(boo { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } Accessibility::RetError ret = serviceProxy_->GetIgnoreRepeatClickState(state); @@ -1289,8 +1421,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetIgnoreRepeatClickTime(IGNO { std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get accessibility service"); - return Accessibility::RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } uint32_t ignoreRepeatClickTime = 0; @@ -1763,5 +1898,18 @@ void AccessibilityConfig::Impl::NotifyDefaultConfigs() NotifyDefaultShortKeyMultiConfigs(); } +sptr AccessibilityConfig::Impl::LoadAccessibilityService() +{ + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (samgr == nullptr) { + return nullptr; + } + sptr object = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, LOAD_ABILITY_TIME_OUT_SECONDS); + if (object) { + serviceProxy_ = iface_cast(object); + } + return object; +} + } // namespace AccessibilityConfig } // namespace OHOS \ No newline at end of file diff --git a/frameworks/asacfwk/include/accessibility_system_ability_client_impl.h b/frameworks/asacfwk/include/accessibility_system_ability_client_impl.h index 32f80515..9833406a 100644 --- a/frameworks/asacfwk/include/accessibility_system_ability_client_impl.h +++ b/frameworks/asacfwk/include/accessibility_system_ability_client_impl.h @@ -239,7 +239,7 @@ private: * @param value The value be changed. */ void NotifyStateChanged(uint32_t eventType, bool value); - + sptr LoadAccessibilityService(); /** * @brief Check the event type is valid or not. * @param eventType The data of event type. diff --git a/frameworks/asacfwk/src/accessibility_system_ability_client_impl.cpp b/frameworks/asacfwk/src/accessibility_system_ability_client_impl.cpp index 4748136d..d5ece5a1 100644 --- a/frameworks/asacfwk/src/accessibility_system_ability_client_impl.cpp +++ b/frameworks/asacfwk/src/accessibility_system_ability_client_impl.cpp @@ -26,6 +26,7 @@ namespace Accessibility { namespace { constexpr int32_t REQUEST_WINDOW_ID_MASK_BIT = 16; constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10; + constexpr int32_t LOAD_ABILITY_TIME_OUT_SECONDS = 3; const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready"; } // namespaces @@ -88,8 +89,11 @@ bool AccessibilitySystemAbilityClientImpl::ConnectToService() sptr object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID); if (!object) { - HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); - return false; + object = LoadAccessibilityService(); + if (!object) { + HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed"); + return false; + } } if (!deathRecipient_) { @@ -99,7 +103,7 @@ bool AccessibilitySystemAbilityClientImpl::ConnectToService() return false; } } - + if ((object->IsProxyObject()) && (!object->AddDeathRecipient(deathRecipient_))) { HILOG_ERROR("Failed to add death recipient"); } @@ -107,8 +111,11 @@ bool AccessibilitySystemAbilityClientImpl::ConnectToService() HILOG_DEBUG("Get remote object ok"); serviceProxy_ = iface_cast(object); if (!serviceProxy_) { - HILOG_ERROR("IAccessibleAbilityManagerService iface_cast failed"); - return false; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return true; } @@ -199,8 +206,11 @@ RetError AccessibilitySystemAbilityClientImpl::RegisterElementOperator( return RET_ERR_INVALID_PARAM; } if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } auto iter = elementOperators_.find(windowId); @@ -224,8 +234,11 @@ void AccessibilitySystemAbilityClientImpl::ReregisterElementOperator() HILOG_DEBUG(); if (!serviceProxy_) { - HILOG_ERROR("serviceProxy_ is null."); - return; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return; + } } for (auto iter = elementOperators_.begin(); iter != elementOperators_.end(); iter++) { serviceProxy_->RegisterElementOperator(iter->first, iter->second); @@ -238,8 +251,11 @@ RetError AccessibilitySystemAbilityClientImpl::DeregisterElementOperator(const i std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } auto iter = elementOperators_.find(windowId); if (iter != elementOperators_.end()) { @@ -290,8 +306,11 @@ RetError AccessibilitySystemAbilityClientImpl::GetAbilityList(const uint32_t acc return RET_ERR_INVALID_PARAM; } if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->GetAbilityList(accessibilityAbilityTypes, stateType, infos); } @@ -318,8 +337,11 @@ RetError AccessibilitySystemAbilityClientImpl::SendEvent(const EventType eventTy event.SetEventType(eventType); event.SetSource(componentId); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SendEvent(event); } @@ -332,8 +354,11 @@ RetError AccessibilitySystemAbilityClientImpl::SendEvent(const AccessibilityEven return RET_ERR_INVALID_PARAM; } if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->SendEvent(event); } @@ -418,8 +443,11 @@ RetError AccessibilitySystemAbilityClientImpl::GetEnabledAbilities(std::vector lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->GetEnabledAbilities(enabledAbilities); } @@ -591,10 +619,27 @@ RetError AccessibilitySystemAbilityClientImpl::GetFocusedWindowId(int32_t &focus HILOG_DEBUG(); std::lock_guard lock(mutex_); if (!serviceProxy_) { - HILOG_ERROR("Failed to get aams service"); - return RET_ERR_SAMGR; + LoadAccessibilityService(); + if (!serviceProxy_) { + HILOG_ERROR("Failed to get accessibility service"); + return Accessibility::RET_ERR_SAMGR; + } } return serviceProxy_->GetFocusedWindowId(focusedWindowId); } + + +sptr AccessibilitySystemAbilityClientImpl::LoadAccessibilityService() +{ + auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (samgr == nullptr) { + return nullptr; + } + sptr object = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, LOAD_ABILITY_TIME_OUT_SECONDS); + if (object) { + serviceProxy_ = iface_cast(object); + } + return object; +} } // namespace Accessibility } // namespace OHOS \ No newline at end of file diff --git a/sa_profile/801.json b/sa_profile/801.json index 3fe2471c..0cb3369c 100644 --- a/sa_profile/801.json +++ b/sa_profile/801.json @@ -4,7 +4,7 @@ { "name": 801, "libpath": "libaccessibleabilityms.z.so", - "run-on-create": true, + "run-on-create": false, "distributed": false, "dump_level": 1 } diff --git a/sa_profile/accessibility.cfg b/sa_profile/accessibility.cfg index 6d0c58f4..cd2c54d9 100644 --- a/sa_profile/accessibility.cfg +++ b/sa_profile/accessibility.cfg @@ -3,8 +3,7 @@ "name" : "post-fs-data", "cmds" : [ "mkdir /data/service/el1/public/barrierfree 0711 accessibility accessibility", - "mkdir /data/service/el1/public/barrierfree/accessibility_ability_manager_service 0711 accessibility accessibility", - "start accessibility" + "mkdir /data/service/el1/public/barrierfree/accessibility_ability_manager_service 0711 accessibility accessibility" ] } ], @@ -21,7 +20,8 @@ ], "permission_acls" : [ "ohos.permission.INTERCEPT_INPUT_EVENT" - ] + ], + "ondemand" : true } ] } -- Gitee