无障碍服务支持动态启停

Signed-off-by: taojuncun <taojuncun@huawei.com>
This commit is contained in:
taojuncun
2024-04-28 21:46:33 +08:00
parent e8b6bbe341
commit 044b4377c4
14 changed files with 598 additions and 289 deletions
@@ -179,6 +179,8 @@ private:
ErrCode HandleGetSceneBoardInnerWinId(MessageParcel &data, MessageParcel &reply);
ErrCode HandleGetFocusedWindowId(MessageParcel &data, MessageParcel &reply);
virtual void PostDelayUnloadTask() = 0;
using AccessibilityAbilityManagerServiceFunc = ErrCode (AccessibleAbilityManagerServiceStub::*)(
MessageParcel &data, MessageParcel &reply);
std::map<uint32_t, AccessibilityAbilityManagerServiceFunc> memberFuncMap_;
@@ -197,6 +197,7 @@ int AccessibleAbilityManagerServiceStub::OnRemoteRequest(
if (memFunc != memberFuncMap_.end()) {
auto func = memFunc->second;
if (func != nullptr) {
PostDelayUnloadTask(); // try to unload accessibility sa
return (this->*func)(data, reply);
}
}
@@ -115,6 +115,7 @@ public:
void GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, int32_t& innerWid) override {}
RetError GetFocusedWindowId(int32_t &focusedWindowId) override {return RET_OK;}
uint32_t RegisterConfigObserver(const sptr<IAccessibleAbilityManagerConfigObserver> &callback) override {return 0;}
void PostDelayUnloadTask() override {}
};
uint32_t GetU32Data(const uint8_t* ptr)
@@ -20,10 +20,14 @@
#include <deque>
#include <memory>
#include <mutex>
#include <condition_variable>
#include "accessible_ability_channel_client.h"
#include "accessible_ability_client.h"
#include "accessible_ability_client_stub.h"
#include "i_accessible_ability_manager_service.h"
#include "refbase.h"
#include "system_ability_load_callback_stub.h"
#include "system_ability_status_change_stub.h"
namespace OHOS {
namespace Accessibility {
@@ -343,6 +347,10 @@ public:
void AddCacheByAce(int32_t windowId, int64_t elementId, std::vector<AccessibilityElementInfo>& elementInfos);
void SortElementInfosIfNecessary(std::vector<AccessibilityElementInfo> &elementInfos);
bool LoadAccessibilityService();
void LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject);
void LoadSystemAbilityFail();
private:
class ElementCacheInfo {
public:
@@ -398,6 +406,19 @@ private:
AccessibleAbilityClientImpl &client_;
};
class AccessibilityLoadCallback : public SystemAbilityLoadCallbackStub {
public:
void OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
const sptr<IRemoteObject> &remoteObject) override;
void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
};
class AccessibilitySaStatusChange : public SystemAbilityStatusChangeStub {
public:
void OnAddSystemAbility(int32_t saId, const std::string &deviceId) override;
void OnRemoveSystemAbility(int32_t saId, const std::string &deviceId) override;
};
bool GetCacheElementInfo(const int32_t windowId,
const int64_t elementId, AccessibilityElementInfo &elementInfo) const;
void SetCacheElementInfo(const int32_t windowId,
@@ -405,7 +426,7 @@ private:
RetError SearchElementInfoFromAce(const int32_t windowId, const int64_t elementId,
const uint32_t mode, AccessibilityElementInfo &info);
bool InitAccessibilityServiceProxy();
static void OnParameterChanged(const char *key, const char *value, void *context);
sptr<Accessibility::IAccessibleAbilityManagerService> GetServiceProxy();
sptr<IRemoteObject::DeathRecipient> deathRecipient_ = nullptr;
sptr<IRemoteObject::DeathRecipient> accessibilityServiceDeathRecipient_ = nullptr;
@@ -420,6 +441,9 @@ private:
// used for query element info in batch
ElementCacheInfo elementCacheInfo_;
SceneBoardWindowElementMap windowElementMap_;
std::condition_variable proxyConVar_;
std::mutex conVarMutex_;
};
} // namespace Accessibility
} // namespace OHOS
@@ -26,17 +26,17 @@
#include "parameter.h"
#include "system_ability_definition.h"
namespace OHOS {
namespace Accessibility {
// tmp: wait for window registing when client connect done
constexpr int WAIT_WINDOW_REGIST = 500;
namespace {
const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10;
constexpr int64_t ROOT_NONE_ID = -1;
constexpr int64_t NODE_ID_MAX = 0x7FFFFFFE;
std::mutex g_Mutex;
sptr<AccessibleAbilityClientImpl> g_Instance = nullptr;
constexpr int32_t SA_CONNECT_TIMEOUT = 500; // ms
} // namespace
sptr<AccessibleAbilityClient> AccessibleAbilityClient::GetInstance()
@@ -62,20 +62,15 @@ sptr<AccessibleAbilityClientImpl> AccessibleAbilityClientImpl::GetAbilityClientI
AccessibleAbilityClientImpl::AccessibleAbilityClientImpl()
{
HILOG_DEBUG();
char value[CONFIG_PARAMETER_VALUE_SIZE] = "default";
int retSysParam = GetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false", value, CONFIG_PARAMETER_VALUE_SIZE);
if (retSysParam >= 0 && !std::strcmp(value, "true")) {
// Accessibility service is ready
if (!InitAccessibilityServiceProxy()) {
HILOG_ERROR("Init accessibility service proxy failed");
}
if (!InitAccessibilityServiceProxy()) {
HILOG_ERROR("Init accessibility service proxy failed");
}
HILOG_DEBUG("Start watching accessibility service.");
retSysParam = WatchParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(),
&AccessibleAbilityClientImpl::OnParameterChanged, this);
if (retSysParam) {
HILOG_ERROR("Watch parameter failed, error = %{public}d", retSysParam);
sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<AccessibilitySaStatusChange> statusChange = new AccessibilitySaStatusChange();
int32_t ret = samgr->SubscribeSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, statusChange);
if (ret != 0) {
HILOG_ERROR("subscribe accessibility failed, error = %{public}d", ret);
}
}
@@ -103,19 +98,12 @@ bool AccessibleAbilityClientImpl::InitAccessibilityServiceProxy()
}
HILOG_DEBUG("ISystemAbilityManager obtained");
sptr<IRemoteObject> object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (!object) {
HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed");
sptr<IRemoteObject> object = samgr->CheckSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (object == nullptr && LoadAccessibilityService() == false) {
return false;
}
HILOG_DEBUG("Get remote object ok");
serviceProxy_ = iface_cast<IAccessibleAbilityManagerService>(object);
if (!serviceProxy_) {
HILOG_ERROR("Get aams proxy failed");
return false;
}
// Add death recipient
if (!accessibilityServiceDeathRecipient_) {
accessibilityServiceDeathRecipient_ = new(std::nothrow) AccessibilityServiceDeathRecipient(*this);
@@ -125,40 +113,61 @@ bool AccessibleAbilityClientImpl::InitAccessibilityServiceProxy()
}
}
if (serviceProxy_->AsObject()) {
if (serviceProxy_ && serviceProxy_->AsObject()) {
HILOG_DEBUG("Add death recipient");
serviceProxy_->AsObject()->AddDeathRecipient(accessibilityServiceDeathRecipient_);
return true;
}
return false;
}
sptr<Accessibility::IAccessibleAbilityManagerService> AccessibleAbilityClientImpl::GetServiceProxy()
{
if (serviceProxy_ || LoadAccessibilityService()) {
return serviceProxy_;
}
return nullptr;
}
bool AccessibleAbilityClientImpl::LoadAccessibilityService()
{
std::unique_lock<std::mutex> lock(conVarMutex_);
sptr<AccessibilityLoadCallback> loadCallback = new AccessibilityLoadCallback();
if (loadCallback == nullptr) {
return false;
}
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return false;
}
int32_t ret = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, loadCallback);
if (ret != 0) {
return false;
}
auto waitStatus = proxyConVar_.wait_for(lock, std::chrono::milliseconds(SA_CONNECT_TIMEOUT),
[=]() { return serviceProxy_ != nullptr; });
if (!waitStatus) {
return false;
}
return true;
}
void AccessibleAbilityClientImpl::OnParameterChanged(const char *key, const char *value, void *context)
void AccessibleAbilityClientImpl::LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject)
{
HILOG_DEBUG("Parameter key = [%{public}s] value = [%{public}s]", key, value);
if (!key || std::strcmp(key, SYSTEM_PARAMETER_AAMS_NAME.c_str())) {
HILOG_WARN("not accessibility.config.ready callback");
return;
std::lock_guard<std::mutex> lock(conVarMutex_);
if (remoteObject != nullptr) {
serviceProxy_ = iface_cast<IAccessibleAbilityManagerService>(remoteObject);
} else {
serviceProxy_ = nullptr;
}
proxyConVar_.notify_one();
}
if (!value || std::strcmp(value, "true")) {
HILOG_WARN("accessibility.config.ready value not true");
return;
}
if (!context) {
HILOG_ERROR("accessibility.config.ready context NULL");
return;
}
AccessibleAbilityClientImpl* implPtr = static_cast<AccessibleAbilityClientImpl*>(context);
{
HILOG_DEBUG("ConnectToService start.");
std::lock_guard<std::mutex> lock(implPtr->mutex_);
if (implPtr->InitAccessibilityServiceProxy()) {
HILOG_DEBUG("ConnectToService Success");
}
}
void AccessibleAbilityClientImpl::LoadSystemAbilityFail()
{
std::lock_guard<std::mutex> lock(conVarMutex_);
serviceProxy_ = nullptr;
proxyConVar_.notify_one();
}
sptr<IRemoteObject> AccessibleAbilityClientImpl::GetRemoteObject()
@@ -374,7 +383,7 @@ RetError AccessibleAbilityClientImpl::GetRoot(AccessibilityElementInfo &elementI
}
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to connect to aams");
return RET_ERR_SAMGR;
}
@@ -449,7 +458,7 @@ RetError AccessibleAbilityClientImpl::GetRootBatch(std::vector<AccessibilityElem
return RET_ERR_NO_CONNECTION;
}
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("failed to connect to aams");
return RET_ERR_SAMGR;
}
@@ -526,7 +535,7 @@ RetError AccessibleAbilityClientImpl::GetRootByWindowBatch(const AccessibilityWi
}
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("failed to connect to aams");
return RET_ERR_SAMGR;
}
@@ -764,7 +773,7 @@ RetError AccessibleAbilityClientImpl::GetByElementId(const int64_t elementId,
}
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("failed to connect to aams");
return RET_ERR_SAMGR;
}
@@ -992,7 +1001,7 @@ RetError AccessibleAbilityClientImpl::SearchElementInfoByInspectorKey(const std:
}
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to connect to aams");
return RET_ERR_SAMGR;
}
@@ -1032,7 +1041,7 @@ RetError AccessibleAbilityClientImpl::Connect()
{
HILOG_DEBUG();
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -1044,7 +1053,7 @@ RetError AccessibleAbilityClientImpl::Disconnect()
{
HILOG_DEBUG();
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -1352,5 +1361,38 @@ void AccessibleAbilityClientImpl::SceneBoardWindowElementMap::RemovePairByWindow
std::lock_guard<std::mutex> lock(mapMutex_);
windowElementMap_.erase(windowId);
}
void AccessibleAbilityClientImpl::AccessibilityLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
const sptr<IRemoteObject> &remoteObject)
{
if (AccessibleAbilityClientImpl::GetAbilityClientImplement()) {
AccessibleAbilityClientImpl::GetAbilityClientImplement()->LoadSystemAbilitySuccess(remoteObject);
}
}
void AccessibleAbilityClientImpl::AccessibilityLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId)
{
if (AccessibleAbilityClientImpl::GetAbilityClientImplement()) {
AccessibleAbilityClientImpl::GetAbilityClientImplement()->LoadSystemAbilityFail();
}
}
void AccessibleAbilityClientImpl::AccessibilitySaStatusChange::OnAddSystemAbility(int32_t saId,
const std::string &deviceId)
{
if (AccessibleAbilityClientImpl::GetAbilityClientImplement() &&
AccessibleAbilityClientImpl::GetAbilityClientImplement()->InitAccessibilityServiceProxy()) {
HILOG_DEBUG("Connect to accessibility service success");
}
}
void AccessibleAbilityClientImpl::AccessibilitySaStatusChange::OnRemoveSystemAbility(int32_t saId,
const std::string &deviceId)
{
HILOG_DEBUG("Disconnect to accessibility service");
if (AccessibleAbilityClientImpl::GetAbilityClientImplement()) {
AccessibleAbilityClientImpl::GetAbilityClientImplement()->SetConnectionState(false);
}
}
} // namespace Accessibility
} // namespace OHOS
@@ -17,12 +17,16 @@
#define ACCESSIBILITY_CONFIG_IMPL_H
#include <mutex>
#include <condition_variable>
#include "accessibility_config.h"
#include "accessibility_enable_ability_lists_observer_stub.h"
#include "accessible_ability_manager_caption_observer_stub.h"
#include "accessible_ability_manager_config_observer_stub.h"
#include "accessible_ability_manager_service_proxy.h"
#include "event_handler.h"
#include "refbase.h"
#include "system_ability_load_callback_stub.h"
#include "system_ability_status_change_stub.h"
namespace OHOS {
namespace AccessibilityConfig {
@@ -103,6 +107,10 @@ public:
void OnAccessibilityEnableAbilityListsChanged();
void OnAccessibilityInstallAbilityListsChanged();
void SetInitializeFlag(bool flag)
{
isInitialized_ = flag;
}
private:
class AccessibilityEnableAbilityListsObserverImpl :
public Accessibility::AccessibilityEnableAbilityListsObserverStub {
@@ -139,6 +147,27 @@ private:
Impl &config_;
};
class AccessibilityLoadCallback : public SystemAbilityLoadCallbackStub {
public:
explicit AccessibilityLoadCallback(Impl* config) : config_(config) {}
~AccessibilityLoadCallback() = default;
void OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
const sptr<IRemoteObject> &remoteObject) override;
void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
private:
Impl* config_ = nullptr;
};
class AccessibilitySaStatusChange : public SystemAbilityStatusChangeStub {
public:
explicit AccessibilitySaStatusChange(Impl* config) : config_(config) {}
~AccessibilitySaStatusChange() = default;
void OnAddSystemAbility(int32_t saId, const std::string &deviceId) override;
void OnRemoveSystemAbility(int32_t saId, const std::string &deviceId) override;
private:
Impl* config_ = nullptr;
};
class AccessibleAbilityManagerConfigObserverImpl
: public Accessibility::AccessibleAbilityManagerConfigObserverStub {
public:
@@ -210,6 +239,11 @@ private:
bool RegisterToService();
bool InitAccessibilityServiceProxy();
bool LoadAccessibilityService();
void LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject);
void LoadSystemAbilityFail();
sptr<Accessibility::IAccessibleAbilityManagerService> GetServiceProxy();
void NotifyCaptionStateChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers,
const bool state);
void NotifyCaptionChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers,
@@ -309,6 +343,9 @@ private:
std::shared_ptr<AppExecFwk::EventRunner> runner_;
std::shared_ptr<AppExecFwk::EventHandler> handler_;
std::condition_variable proxyConVar_;
std::mutex conVarMutex_; // mutex for proxyConVar
};
} // namespace AccessibilityConfig
} // namespace OHOS
+236 -171
View File
@@ -23,9 +23,8 @@
namespace OHOS {
namespace AccessibilityConfig {
namespace {
const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10;
} // namespace
constexpr int32_t SA_CONNECT_TIMEOUT = 500; // ms
}
AccessibilityConfig::Impl::Impl()
{}
@@ -33,63 +32,31 @@ AccessibilityConfig::Impl::Impl()
bool AccessibilityConfig::Impl::InitializeContext()
{
HILOG_DEBUG();
std::lock_guard<std::mutex> lock(mutex_);
if (isInitialized_) {
HILOG_DEBUG("Context has initialized");
return true;
}
isInitialized_ = ConnectToService();
return isInitialized_;
}
void AccessibilityConfig::Impl::OnParameterChanged(const char *key, const char *value, void *context)
{
HILOG_DEBUG("Parameter key = [%{public}s] value = [%{public}s]", key, value);
if (!key || std::strcmp(key, SYSTEM_PARAMETER_AAMS_NAME.c_str())) {
HILOG_WARN("not accessibility.config.ready callback");
return;
}
if (!value || std::strcmp(value, "true")) {
HILOG_WARN("accessibility.config.ready value not true");
return;
}
if (!context) {
HILOG_ERROR("accessibility.config.ready context NULL");
return;
}
Impl* implPtr = static_cast<Impl*>(context);
(void)implPtr->ConnectToServiceAsync();
}
bool AccessibilityConfig::Impl::ConnectToService()
{
char value[CONFIG_PARAMETER_VALUE_SIZE] = "default";
int retSysParam = GetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false", value, CONFIG_PARAMETER_VALUE_SIZE);
if (retSysParam >= 0 && !std::strcmp(value, "true")) {
// Accessibility service is ready
if (!InitAccessibilityServiceProxy()) {
return false;
}
if (!RegisterToService()) {
return false;
}
InitConfigValues();
} else {
HILOG_DEBUG("Start watching accessibility service.");
retSysParam = WatchParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), &OnParameterChanged, this);
if (retSysParam) {
HILOG_ERROR("Watch parameter failed, error = %{public}d", retSysParam);
return false;
}
std::lock_guard<std::mutex> lock(mutex_);
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return false;
}
if (InitAccessibilityServiceProxy() && RegisterToService()) {
InitConfigValues();
return true;
}
sptr<AccessibilitySaStatusChange> statusChange = new AccessibilitySaStatusChange(this);
int32_t ret = samgr->SubscribeSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, statusChange);
if (ret != 0) {
HILOG_ERROR("subscribe accessibility failed, error = %{public}d", ret);
return false;
}
return true;
}
@@ -100,6 +67,7 @@ bool AccessibilityConfig::Impl::ConnectToServiceAsync()
if (InitAccessibilityServiceProxy()) {
(void)RegisterToService();
InitConfigValues();
isInitialized_ = true;
return true;
} else {
HILOG_ERROR("ConnectToServiceAsync fail");
@@ -107,6 +75,101 @@ bool AccessibilityConfig::Impl::ConnectToServiceAsync()
}
}
bool AccessibilityConfig::Impl::InitAccessibilityServiceProxy()
{
HILOG_DEBUG();
if (serviceProxy_) {
return true;
}
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return false;
}
auto object = samgr->CheckSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (object != nullptr) {
if (!deathRecipient_) {
deathRecipient_ = new(std::nothrow) DeathRecipient(*this);
if (!deathRecipient_) {
HILOG_ERROR("create deathRecipient_ fail");
return false;
}
}
if (object->IsProxyObject() && !object->AddDeathRecipient(deathRecipient_)) {
HILOG_ERROR("Failed to add death recipient");
}
serviceProxy_ = iface_cast<Accessibility::IAccessibleAbilityManagerService>(object);
if (!serviceProxy_) {
HILOG_ERROR("IAccessibleAbilityManagerService iface_cast failed");
return false;
}
HILOG_DEBUG("InitAccessibilityServiceProxy success");
return true;
} else {
if (LoadAccessibilityService()) {
isInitialized_ = true;
HILOG_DEBUG("InitAccessibilityServiceProxy success");
return true;
} else {
return false;
}
}
return true;
}
bool AccessibilityConfig::Impl::LoadAccessibilityService()
{
std::unique_lock<std::mutex> lock(conVarMutex_);
sptr<AccessibilityLoadCallback> loadCallback = new AccessibilityLoadCallback(this);
if (loadCallback == nullptr) {
return false;
}
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return false;
}
int32_t ret = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, loadCallback);
if (ret != 0) {
return false;
}
auto waitStatus = proxyConVar_.wait_for(lock, std::chrono::milliseconds(SA_CONNECT_TIMEOUT),
[=]() { return serviceProxy_ != nullptr; });
if (!waitStatus) {
return false;
}
(void)RegisterToService();
InitConfigValues();
return true;
}
void AccessibilityConfig::Impl::LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject)
{
std::lock_guard<std::mutex> lock(conVarMutex_);
if (remoteObject != nullptr) {
serviceProxy_ = iface_cast<Accessibility::IAccessibleAbilityManagerService>(remoteObject);
if (!deathRecipient_) {
deathRecipient_ = new(std::nothrow) DeathRecipient(*this);
if (!deathRecipient_) {
HILOG_ERROR("create deathRecipient_ fail.");
}
}
if (remoteObject->IsProxyObject() && remoteObject->AddDeathRecipient(deathRecipient_)) {
HILOG_DEBUG("successed to add death recipient");
}
} else {
serviceProxy_ = nullptr;
}
proxyConVar_.notify_one();
}
void AccessibilityConfig::Impl::LoadSystemAbilityFail()
{
std::lock_guard<std::mutex> lock(conVarMutex_);
serviceProxy_ = nullptr;
proxyConVar_.notify_one();
}
bool AccessibilityConfig::Impl::RegisterToService()
{
if (!serviceProxy_) {
@@ -158,46 +221,12 @@ bool AccessibilityConfig::Impl::RegisterToService()
return true;
}
bool AccessibilityConfig::Impl::InitAccessibilityServiceProxy()
sptr<Accessibility::IAccessibleAbilityManagerService> AccessibilityConfig::Impl::GetServiceProxy()
{
if (serviceProxy_) {
HILOG_DEBUG("Accessibility Service is connected");
return true;
if (serviceProxy_ || LoadAccessibilityService()) {
return serviceProxy_;
}
sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (!samgr) {
HILOG_ERROR("Failed to get ISystemAbilityManager");
return false;
}
sptr<IRemoteObject> object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (!object) {
HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed");
return false;
}
if (!deathRecipient_) {
deathRecipient_ = new(std::nothrow) DeathRecipient(*this);
if (!deathRecipient_) {
HILOG_ERROR("Create deathRecipient_ fail.");
return false;
}
}
if ((object->IsProxyObject()) && (!object->AddDeathRecipient(deathRecipient_))) {
HILOG_ERROR("Failed to add death recipient");
return false;
}
serviceProxy_ = iface_cast<Accessibility::IAccessibleAbilityManagerService>(object);
if (!serviceProxy_) {
HILOG_ERROR("IAccessibleAbilityManagerService iface_cast failed");
return false;
}
HILOG_DEBUG("InitAccessibilityServiceProxy success");
return true;
return nullptr;
}
void AccessibilityConfig::Impl::ResetService(const wptr<IRemoteObject> &remote)
@@ -221,32 +250,32 @@ Accessibility::RetError AccessibilityConfig::Impl::EnableAbility(const std::stri
{
HILOG_INFO("name = [%{private}s] capabilities = [%{private}u]", name.c_str(), capabilities);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->EnableAbility(name, capabilities);
return GetServiceProxy()->EnableAbility(name, capabilities);
}
Accessibility::RetError AccessibilityConfig::Impl::DisableAbility(const std::string &name)
{
HILOG_INFO("name = [%{private}s]", name.c_str());
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->DisableAbility(name);
return GetServiceProxy()->DisableAbility(name);
}
Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetCaptionState(state);
Accessibility::RetError ret = GetServiceProxy()->GetCaptionState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -254,11 +283,11 @@ Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsState(bool &state)
Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsProperty(CaptionProperty &caption)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetCaptionProperty(caption);
Accessibility::RetError ret = GetServiceProxy()->GetCaptionProperty(caption);
HILOG_INFO();
return ret;
}
@@ -267,22 +296,22 @@ Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsProperty(const Cap
{
HILOG_INFO();
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetCaptionProperty(caption);
return GetServiceProxy()->SetCaptionProperty(caption);
}
Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetCaptionState(state);
return GetServiceProxy()->SetCaptionState(state);
}
void AccessibilityConfig::Impl::NotifyCaptionStateChanged(
@@ -390,44 +419,44 @@ Accessibility::RetError AccessibilityConfig::Impl::SetScreenMagnificationState(c
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetScreenMagnificationState(state);
return GetServiceProxy()->SetScreenMagnificationState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetShortKeyState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetShortKeyState(state);
return GetServiceProxy()->SetShortKeyState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetMouseKeyState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetMouseKeyState(state);
return GetServiceProxy()->SetMouseKeyState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::GetScreenMagnificationState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetScreenMagnificationState(state);
Accessibility::RetError ret = GetServiceProxy()->GetScreenMagnificationState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -435,12 +464,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetScreenMagnificationState(b
Accessibility::RetError AccessibilityConfig::Impl::GetShortKeyState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetShortKeyState(state);
Accessibility::RetError ret = GetServiceProxy()->GetShortKeyState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -448,12 +477,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetShortKeyState(bool &state)
Accessibility::RetError AccessibilityConfig::Impl::GetMouseKeyState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetMouseKeyState(state);
Accessibility::RetError ret = GetServiceProxy()->GetMouseKeyState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -782,44 +811,44 @@ Accessibility::RetError AccessibilityConfig::Impl::SetMouseAutoClick(const int32
{
HILOG_INFO("time = [%{public}d]", time);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetMouseAutoClick(time);
return GetServiceProxy()->SetMouseAutoClick(time);
}
Accessibility::RetError AccessibilityConfig::Impl::SetShortkeyTarget(const std::string& name)
{
HILOG_INFO("name = [%{public}s]", name.c_str());
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetShortkeyTarget(name);
return GetServiceProxy()->SetShortkeyTarget(name);
}
Accessibility::RetError AccessibilityConfig::Impl::SetShortkeyMultiTarget(const std::vector<std::string>& name)
{
HILOG_INFO("start");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetShortkeyMultiTarget(name);
return GetServiceProxy()->SetShortkeyMultiTarget(name);
}
Accessibility::RetError AccessibilityConfig::Impl::GetMouseAutoClick(int32_t &time)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetMouseAutoClick(time);
Accessibility::RetError ret = GetServiceProxy()->GetMouseAutoClick(time);
HILOG_INFO("time = [%{public}d]", time);
return ret;
}
@@ -827,12 +856,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetMouseAutoClick(int32_t &ti
Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyTarget(std::string &name)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetShortkeyTarget(name);
Accessibility::RetError ret = GetServiceProxy()->GetShortkeyTarget(name);
HILOG_INFO("name = [%{public}s]", name.c_str());
return ret;
}
@@ -840,12 +869,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyTarget(std::string
Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyMultiTarget(std::vector<std::string> &name)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetShortkeyMultiTarget(name);
Accessibility::RetError ret = GetServiceProxy()->GetShortkeyMultiTarget(name);
return ret;
}
@@ -1010,143 +1039,143 @@ Accessibility::RetError AccessibilityConfig::Impl::SetHighContrastTextState(cons
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetHighContrastTextState(state);
return GetServiceProxy()->SetHighContrastTextState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetInvertColorState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetInvertColorState(state);
return GetServiceProxy()->SetInvertColorState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetDaltonizationState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetDaltonizationState(state);
return GetServiceProxy()->SetDaltonizationState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetDaltonizationColorFilter(const DALTONIZATION_TYPE type)
{
HILOG_INFO("type = [%{public}u]", static_cast<uint32_t>(type));
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetDaltonizationColorFilter(type);
return GetServiceProxy()->SetDaltonizationColorFilter(type);
}
Accessibility::RetError AccessibilityConfig::Impl::SetContentTimeout(const uint32_t timer)
{
HILOG_INFO("timer = [%{public}u]", timer);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetContentTimeout(timer);
return GetServiceProxy()->SetContentTimeout(timer);
}
Accessibility::RetError AccessibilityConfig::Impl::SetAnimationOffState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetAnimationOffState(state);
return GetServiceProxy()->SetAnimationOffState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetBrightnessDiscount(const float brightness)
{
HILOG_INFO("brightness = [%{public}f]", brightness);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetBrightnessDiscount(brightness);
return GetServiceProxy()->SetBrightnessDiscount(brightness);
}
Accessibility::RetError AccessibilityConfig::Impl::SetAudioMonoState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetAudioMonoState(state);
return GetServiceProxy()->SetAudioMonoState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetAudioBalance(const float balance)
{
HILOG_INFO("balance = [%{public}f]", balance);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetAudioBalance(balance);
return GetServiceProxy()->SetAudioBalance(balance);
}
Accessibility::RetError AccessibilityConfig::Impl::SetClickResponseTime(const CLICK_RESPONSE_TIME time)
{
HILOG_INFO("click response time = [%{public}u]", time);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetClickResponseTime(time);
return GetServiceProxy()->SetClickResponseTime(time);
}
Accessibility::RetError AccessibilityConfig::Impl::SetIgnoreRepeatClickState(const bool state)
{
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetIgnoreRepeatClickState(state);
return GetServiceProxy()->SetIgnoreRepeatClickState(state);
}
Accessibility::RetError AccessibilityConfig::Impl::SetIgnoreRepeatClickTime(const IGNORE_REPEAT_CLICK_TIME time)
{
HILOG_INFO("ignore repeat click time = [%{public}u]", time);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
return serviceProxy_->SetIgnoreRepeatClickTime(time);
return GetServiceProxy()->SetIgnoreRepeatClickTime(time);
}
Accessibility::RetError AccessibilityConfig::Impl::GetInvertColorState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetInvertColorState(state);
Accessibility::RetError ret = GetServiceProxy()->GetInvertColorState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1154,12 +1183,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetInvertColorState(bool &sta
Accessibility::RetError AccessibilityConfig::Impl::GetHighContrastTextState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetHighContrastTextState(state);
Accessibility::RetError ret = GetServiceProxy()->GetHighContrastTextState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1167,12 +1196,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetHighContrastTextState(bool
Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetDaltonizationState(state);
Accessibility::RetError ret = GetServiceProxy()->GetDaltonizationState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1180,13 +1209,13 @@ Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationState(bool &s
Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationColorFilter(DALTONIZATION_TYPE &type)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
uint32_t filterType = 0;
Accessibility::RetError ret = serviceProxy_->GetDaltonizationColorFilter(filterType);
Accessibility::RetError ret = GetServiceProxy()->GetDaltonizationColorFilter(filterType);
type = static_cast<DALTONIZATION_TYPE>(filterType);
HILOG_INFO("type = [%{public}u]", static_cast<uint32_t>(type));
return ret;
@@ -1195,12 +1224,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationColorFilter(D
Accessibility::RetError AccessibilityConfig::Impl::GetContentTimeout(uint32_t &timer)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetContentTimeout(timer);
Accessibility::RetError ret = GetServiceProxy()->GetContentTimeout(timer);
HILOG_INFO("timer = [%{public}u]", timer);
return ret;
}
@@ -1208,12 +1237,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetContentTimeout(uint32_t &t
Accessibility::RetError AccessibilityConfig::Impl::GetAnimationOffState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetAnimationOffState(state);
Accessibility::RetError ret = GetServiceProxy()->GetAnimationOffState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1221,12 +1250,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAnimationOffState(bool &st
Accessibility::RetError AccessibilityConfig::Impl::GetBrightnessDiscount(float &brightness)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetBrightnessDiscount(brightness);
Accessibility::RetError ret = GetServiceProxy()->GetBrightnessDiscount(brightness);
HILOG_INFO("brightness = [%{public}f]", brightness);
return ret;
}
@@ -1234,12 +1263,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetBrightnessDiscount(float &
Accessibility::RetError AccessibilityConfig::Impl::GetAudioMonoState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetAudioMonoState(state);
Accessibility::RetError ret = GetServiceProxy()->GetAudioMonoState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1247,12 +1276,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAudioMonoState(bool &state
Accessibility::RetError AccessibilityConfig::Impl::GetAudioBalance(float &balance)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetAudioBalance(balance);
Accessibility::RetError ret = GetServiceProxy()->GetAudioBalance(balance);
HILOG_INFO("balance = [%{public}f]", balance);
return ret;
}
@@ -1260,13 +1289,13 @@ Accessibility::RetError AccessibilityConfig::Impl::GetAudioBalance(float &balanc
Accessibility::RetError AccessibilityConfig::Impl::GetClickResponseTime(CLICK_RESPONSE_TIME &time)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
uint32_t responseTime = 0;
Accessibility::RetError ret = serviceProxy_->GetClickResponseTime(responseTime);
Accessibility::RetError ret = GetServiceProxy()->GetClickResponseTime(responseTime);
time = static_cast<CLICK_RESPONSE_TIME>(responseTime);
HILOG_INFO("click response time = [%{public}u]", time);
return ret;
@@ -1275,12 +1304,12 @@ Accessibility::RetError AccessibilityConfig::Impl::GetClickResponseTime(CLICK_RE
Accessibility::RetError AccessibilityConfig::Impl::GetIgnoreRepeatClickState(bool &state)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
Accessibility::RetError ret = serviceProxy_->GetIgnoreRepeatClickState(state);
Accessibility::RetError ret = GetServiceProxy()->GetIgnoreRepeatClickState(state);
HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
return ret;
}
@@ -1288,13 +1317,13 @@ Accessibility::RetError AccessibilityConfig::Impl::GetIgnoreRepeatClickState(boo
Accessibility::RetError AccessibilityConfig::Impl::GetIgnoreRepeatClickTime(IGNORE_REPEAT_CLICK_TIME &time)
{
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!GetServiceProxy()) {
HILOG_ERROR("Failed to get accessibility service");
return Accessibility::RET_ERR_SAMGR;
}
uint32_t ignoreRepeatClickTime = 0;
Accessibility::RetError ret = serviceProxy_->GetIgnoreRepeatClickTime(ignoreRepeatClickTime);
Accessibility::RetError ret = GetServiceProxy()->GetIgnoreRepeatClickTime(ignoreRepeatClickTime);
time = static_cast<IGNORE_REPEAT_CLICK_TIME>(ignoreRepeatClickTime);
HILOG_INFO("ignore repeat click time = [%{public}u]", time);
return ret;
@@ -1780,5 +1809,41 @@ void AccessibilityConfig::Impl::NotifyDefaultConfigs()
NotifyDefaultShortKeyMultiConfigs();
}
void AccessibilityConfig::Impl::AccessibilityLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
const sptr<IRemoteObject> &remoteObject)
{
HILOG_DEBUG();
if (config_) {
config_->LoadSystemAbilitySuccess(remoteObject);
}
}
void AccessibilityConfig::Impl::AccessibilityLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId)
{
HILOG_DEBUG();
if (config_) {
config_->LoadSystemAbilityFail();
}
}
void AccessibilityConfig::Impl::AccessibilitySaStatusChange::OnAddSystemAbility(int32_t saId,
const std::string &deviceId)
{
HILOG_DEBUG();
if (config_ && config_->ConnectToServiceAsync()) {
config_->SetInitializeFlag(true);
HILOG_DEBUG("connect to accessibility service success.");
}
}
void AccessibilityConfig::Impl::AccessibilitySaStatusChange::OnRemoveSystemAbility(int32_t saId,
const std::string &deviceId)
{
HILOG_DEBUG();
if (config_) {
config_->SetInitializeFlag(false);
HILOG_DEBUG("disconnect to Accessibility service");
}
}
} // namespace AccessibilityConfig
} // namespace OHOS
@@ -18,10 +18,14 @@
#include <array>
#include <mutex>
#include <condition_variable>
#include "accessibility_element_operator_impl.h"
#include "accessibility_system_ability_client.h"
#include "accessible_ability_manager_state_observer_stub.h"
#include "i_accessible_ability_manager_service.h"
#include "refbase.h"
#include "system_ability_load_callback_stub.h"
#include "system_ability_status_change_stub.h"
namespace OHOS {
namespace Accessibility {
@@ -202,6 +206,10 @@ public:
virtual void SetPerformActionResult(const bool succeeded, const int32_t requestId) override;
virtual RetError GetFocusedWindowId(int32_t &focusedWindowId) override;
bool LoadAccessibilityService();
void LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject);
void LoadSystemAbilityFail();
private:
class AccessibleAbilityManagerStateObserverImpl : public AccessibleAbilityManagerStateObserverStub {
public:
@@ -231,6 +239,19 @@ private:
AccessibilitySystemAbilityClientImpl &client_;
};
class AccessibilityLoadCallback : public SystemAbilityLoadCallbackStub {
public:
void OnLoadSystemAbilitySuccess(int32_t systemAbilityId,
const sptr<IRemoteObject> &remoteObject) override;
void OnLoadSystemAbilityFail(int32_t systemAbilityId) override;
};
class AccessibilitySaStatusChange : public SystemAbilityStatusChangeStub {
public:
void OnAddSystemAbility(int32_t saId, const std::string &deviceId) override;
void OnRemoveSystemAbility(int32_t saId, const std::string &deviceId) override;
};
/**
* @brief Connect to AAMS Service.
* @return success : true, failed : false.
@@ -265,6 +286,9 @@ private:
sptr<IRemoteObject::DeathRecipient> deathRecipient_ = nullptr;
sptr<IAccessibleAbilityManagerService> serviceProxy_ = nullptr;
sptr<AccessibleAbilityManagerStateObserverImpl> stateObserver_ = nullptr;
std::condition_variable proxyConVar_;
std::mutex conVarMutex_; // mutex for proxyConVar
};
} // namespace Accessibility
} // namespace OHOS
@@ -25,8 +25,7 @@ namespace OHOS {
namespace Accessibility {
namespace {
constexpr int32_t REQUEST_WINDOW_ID_MASK_BIT = 16;
constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10;
const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
constexpr int32_t SA_CONNECT_TIMEOUT = 500; // ms
} // namespaces
static std::mutex g_Mutex;
@@ -49,20 +48,14 @@ AccessibilitySystemAbilityClientImpl::AccessibilitySystemAbilityClientImpl()
HILOG_DEBUG();
stateArray_.fill(false);
char value[CONFIG_PARAMETER_VALUE_SIZE] = "default";
int retSysParam = GetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false", value, CONFIG_PARAMETER_VALUE_SIZE);
if (retSysParam >= 0 && !std::strcmp(value, "true")) {
HILOG_ERROR("accessibility service is ready.");
if (!ConnectToService()) {
HILOG_ERROR("Failed to connect to aams service");
return;
}
Init();
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return;
}
retSysParam = WatchParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), &OnParameterChanged, this);
if (retSysParam) {
HILOG_ERROR("Watch parameter failed, error = %{public}d", retSysParam);
sptr<AccessibilitySaStatusChange> statusChange = new AccessibilitySaStatusChange();
int32_t ret = samgr->SubscribeSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, statusChange);
if (ret != 0) {
HILOG_ERROR("subscribe accessibility failed, error = %{public}d", ret);
}
}
@@ -80,14 +73,14 @@ bool AccessibilitySystemAbilityClientImpl::ConnectToService()
return true;
}
sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (!samgr) {
HILOG_ERROR("Failed to get ISystemAbilityManager");
return false;
}
sptr<IRemoteObject> object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (!object) {
sptr<IRemoteObject> object = samgr->CheckSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (object == nullptr && LoadAccessibilityService() == false) {
HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed");
return false;
}
@@ -113,40 +106,45 @@ bool AccessibilitySystemAbilityClientImpl::ConnectToService()
return true;
}
void AccessibilitySystemAbilityClientImpl::OnParameterChanged(const char *key, const char *value, void *context)
bool AccessibilitySystemAbilityClientImpl::LoadAccessibilityService()
{
HILOG_DEBUG("Parameter key = [%{public}s] value = [%{public}s]", key, value);
if (!key || std::strcmp(key, SYSTEM_PARAMETER_AAMS_NAME.c_str())) {
HILOG_WARN("not accessibility.config.ready callback");
return;
std::unique_lock<std::mutex> lock(conVarMutex_);
sptr<AccessibilityLoadCallback> loadCallback = new AccessibilityLoadCallback();
if (loadCallback == nullptr) {
return false;
}
if (!value || std::strcmp(value, "true")) {
HILOG_WARN("accessibility.config.ready value not true");
return;
auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (samgr == nullptr) {
return false;
}
if (!context) {
HILOG_ERROR("accessibility.config.ready context NULL");
return;
int32_t ret = samgr->LoadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID, loadCallback);
if (ret != 0) {
return false;
}
AccessibilitySystemAbilityClientImpl* implPtr = static_cast<AccessibilitySystemAbilityClientImpl*>(context);
{
HILOG_DEBUG("ConnectToService start.");
std::lock_guard<std::mutex> lock(implPtr->mutex_);
if (implPtr->serviceProxy_) {
HILOG_DEBUG("service is already started.");
return;
}
if (!implPtr->ConnectToService()) {
HILOG_ERROR("Failed to connect to aams service");
return;
}
implPtr->Init();
implPtr->ReregisterElementOperator();
auto waitStatus = proxyConVar_.wait_for(lock, std::chrono::milliseconds(SA_CONNECT_TIMEOUT),
[=]() { return serviceProxy_ != nullptr; });
if (!waitStatus) {
return false;
}
return true;
}
void AccessibilitySystemAbilityClientImpl::LoadSystemAbilitySuccess(const sptr<IRemoteObject> &remoteObject)
{
std::lock_guard<std::mutex> lock(conVarMutex_);
if (remoteObject != nullptr) {
serviceProxy_ = iface_cast<IAccessibleAbilityManagerService>(remoteObject);
} else {
serviceProxy_ = nullptr;
}
proxyConVar_.notify_one();
}
void AccessibilitySystemAbilityClientImpl::LoadSystemAbilityFail()
{
std::lock_guard<std::mutex> lock(conVarMutex_);
serviceProxy_ = nullptr;
proxyConVar_.notify_one();
}
void AccessibilitySystemAbilityClientImpl::Init()
@@ -160,6 +158,9 @@ void AccessibilitySystemAbilityClientImpl::Init()
return;
}
}
if (serviceProxy_ == nullptr) {
return;
}
uint32_t stateType = serviceProxy_->RegisterStateObserver(stateObserver_);
if (stateType & STATE_ACCESSIBILITY_ENABLED) {
stateArray_[AccessibilityStateEventType::EVENT_ACCESSIBILITY_STATE_CHANGED] = true;
@@ -198,7 +199,7 @@ RetError AccessibilitySystemAbilityClientImpl::RegisterElementOperator(
HILOG_ERROR("Input operation is null");
return RET_ERR_INVALID_PARAM;
}
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -237,7 +238,7 @@ RetError AccessibilitySystemAbilityClientImpl::DeregisterElementOperator(const i
HILOG_INFO("Deregister windowId[%{public}d] start", windowId);
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -289,7 +290,7 @@ RetError AccessibilitySystemAbilityClientImpl::GetAbilityList(const uint32_t acc
accessibilityAbilityTypes, stateType);
return RET_ERR_INVALID_PARAM;
}
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -317,7 +318,7 @@ RetError AccessibilitySystemAbilityClientImpl::SendEvent(const EventType eventTy
AccessibilityEventInfo event;
event.SetEventType(eventType);
event.SetSource(componentId);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -331,7 +332,7 @@ RetError AccessibilitySystemAbilityClientImpl::SendEvent(const AccessibilityEven
if (!CheckEventType(event.GetEventType())) {
return RET_ERR_INVALID_PARAM;
}
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -417,7 +418,7 @@ RetError AccessibilitySystemAbilityClientImpl::GetEnabledAbilities(std::vector<s
{
HILOG_DEBUG();
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
@@ -605,11 +606,52 @@ RetError AccessibilitySystemAbilityClientImpl::GetFocusedWindowId(int32_t &focus
{
HILOG_DEBUG();
std::lock_guard<std::mutex> lock(mutex_);
if (!serviceProxy_) {
if (!serviceProxy_ && !LoadAccessibilityService()) {
HILOG_ERROR("Failed to get aams service");
return RET_ERR_SAMGR;
}
return serviceProxy_->GetFocusedWindowId(focusedWindowId);
}
void AccessibilitySystemAbilityClientImpl::AccessibilityLoadCallback::OnLoadSystemAbilitySuccess(
int32_t systemAbilityId, const sptr<IRemoteObject> &remoteObject)
{
HILOG_DEBUG();
if (g_Instance) {
g_Instance->LoadSystemAbilitySuccess(remoteObject);
}
}
void AccessibilitySystemAbilityClientImpl::AccessibilityLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId)
{
HILOG_DEBUG();
if (g_Instance) {
g_Instance->LoadSystemAbilityFail();
}
}
void AccessibilitySystemAbilityClientImpl::AccessibilitySaStatusChange::OnAddSystemAbility(int32_t saId,
const std::string &deviceId)
{
HILOG_DEBUG();
if (!g_Instance) {
return;
}
std::lock_guard<std::mutex> lock(g_Instance->mutex_);
if (g_Instance->serviceProxy_) {
return;
}
if (!g_Instance->ConnectToService()) {
return;
}
g_Instance->Init();
g_Instance->ReregisterElementOperator();
}
void AccessibilitySystemAbilityClientImpl::AccessibilitySaStatusChange::OnRemoveSystemAbility(int32_t saId,
const std::string &deviceId)
{
HILOG_WARN("disconnect to accessibility service");
}
} // namespace Accessibility
} // namespace OHOS
} // namespace OHOS
+1
View File
@@ -82,6 +82,7 @@ ohos_unittest("asac_unit_test") {
"hilog:libhilog",
"init:libbegetutil",
"ipc:ipc_core",
"samgr:samgr_proxy",
]
}
@@ -82,6 +82,7 @@ public:
void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
int Dump(int fd, const std::vector<std::u16string>& args) override;
void PostDelayUnloadTask() override;
public:
/* For AccessibleAbilityManagerServiceStub */
@@ -367,6 +368,7 @@ private:
void OnDeviceProvisioned();
void RegisterShortKeyEvent();
bool IsNeedUnload();
bool isReady_ = false;
bool isPublished_ = false;
@@ -51,6 +51,7 @@ RetError AccessibleAbilityChannel::SearchElementInfoByAccessibilityId(const int3
const int32_t mode, bool isFilter)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
@@ -96,6 +97,7 @@ RetError AccessibleAbilityChannel::SearchElementInfosByText(const int32_t access
const sptr<IAccessibilityElementOperatorCallback> &callback)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
@@ -134,6 +136,7 @@ RetError AccessibleAbilityChannel::FindFocusedElementInfo(const int32_t accessib
const sptr<IAccessibilityElementOperatorCallback> &callback)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
@@ -171,6 +174,7 @@ RetError AccessibleAbilityChannel::FocusMoveSearch(const int32_t accessibilityWi
const int32_t direction, const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
@@ -207,6 +211,7 @@ RetError AccessibleAbilityChannel::FocusMoveSearch(const int32_t accessibilityWi
void AccessibleAbilityChannel::SetKeyCodeSingle(std::shared_ptr<MMI::KeyEvent>& keyEvent, const int32_t keyCode)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!keyEvent) {
HILOG_ERROR("KeyEvent is nullptr");
return;
@@ -226,6 +231,7 @@ void AccessibleAbilityChannel::SetKeyCodeMulti(std::shared_ptr<MMI::KeyEvent>& k
const int32_t keyCodeNext)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!keyEvent) {
HILOG_ERROR("KeyEvent is nullptr");
return;
@@ -248,6 +254,7 @@ void AccessibleAbilityChannel::SetKeyCodeMulti(std::shared_ptr<MMI::KeyEvent>& k
RetError AccessibleAbilityChannel::TransmitActionToMmi(const int32_t action)
{
HILOG_DEBUG("The action is %{public}d", action);
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
std::shared_ptr<MMI::KeyEvent> keyEvent = MMI::KeyEvent::Create();
if (!keyEvent) {
HILOG_ERROR("KeyEvent is nullptr");
@@ -275,6 +282,7 @@ RetError AccessibleAbilityChannel::TransmitActionToMmi(const int32_t action)
RetError AccessibleAbilityChannel::EnableScreenCurtain(bool isEnable)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
HILOG_INFO("enter AccessibleAbilityChannel::EnableScreenCurtain isEnable = %{public}d", isEnable);
if (!eventHandler_) {
@@ -298,7 +306,7 @@ RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWind
const sptr<IAccessibilityElementOperatorCallback> &callback)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
return RET_ERR_NULLPTR;
@@ -343,7 +351,7 @@ RetError AccessibleAbilityChannel::ExecuteAction(const int32_t accessibilityWind
RetError AccessibleAbilityChannel::GetWindow(const int32_t windowId, AccessibilityWindowInfo &windowInfo)
{
HILOG_DEBUG("windowId:%{public}d", windowId);
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
return RET_ERR_NULLPTR;
@@ -387,6 +395,7 @@ RetError AccessibleAbilityChannel::GetWindow(const int32_t windowId, Accessibili
RetError AccessibleAbilityChannel::GetWindows(std::vector<AccessibilityWindowInfo> &windows)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
#ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
uint64_t displayId = Singleton<AccessibilityDisplayManager>::GetInstance().GetDefaultDisplayId();
HILOG_DEBUG("default display id is %{public}" PRIu64 "", displayId);
@@ -459,7 +468,7 @@ RetError AccessibleAbilityChannel::GetWindows(uint64_t displayId, std::vector<Ac
void AccessibleAbilityChannel::SetOnKeyPressEventResult(const bool handled, const int32_t sequence)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
return;
@@ -485,6 +494,7 @@ RetError AccessibleAbilityChannel::GetCursorPosition(const int32_t accessibility
const int32_t requestId, const sptr<IAccessibilityElementOperatorCallback> &callback)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr.");
return RET_ERR_NULLPTR;
@@ -520,6 +530,7 @@ RetError AccessibleAbilityChannel::SendSimulateGesture(
const std::shared_ptr<AccessibilityGestureInjectPath>& gesturePath)
{
HILOG_INFO();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr");
return RET_ERR_NULLPTR;
@@ -564,6 +575,7 @@ RetError AccessibleAbilityChannel::SendSimulateGesture(
RetError AccessibleAbilityChannel::SetTargetBundleName(const std::vector<std::string> &targetBundleNames)
{
HILOG_DEBUG();
Singleton<AccessibleAbilityManagerService>::GetInstance().PostDelayUnloadTask();
if (!eventHandler_) {
HILOG_ERROR("eventHandler_ is nullptr");
return RET_ERR_NULLPTR;
@@ -50,11 +50,13 @@ namespace {
const std::string ARKUI_ANIMATION_SCALE_NAME = "persist.sys.arkui.animationscale";
const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.huawei.hmos.screenreader/AccessibilityExtAbility";
const std::string DEVICE_PROVISIONED = "device_provisioned";
const std::string DELAY_UNLOAD_TASK = "TASK_UNLOAD_ACCESSIBILITY_SA";
constexpr int32_t QUERY_USER_ID_RETRY_COUNT = 600;
constexpr int32_t QUERY_USER_ID_SLEEP_TIME = 50;
constexpr uint32_t TIME_OUT_OPERATOR = 5000;
constexpr int32_t REQUEST_ID_MAX = 0x0000FFFF;
constexpr int32_t DEFAULT_ACCOUNT_ID = 100;
constexpr int32_t UNLOAD_TASK_INTERNAL = 3 * 60 * 1000; // ms
} // namespace
const bool REGISTER_RESULT =
@@ -102,7 +104,6 @@ void AccessibleAbilityManagerService::OnStart()
return;
}
}
SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
HILOG_DEBUG("AddAbilityListener!");
AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID);
@@ -154,7 +155,6 @@ void AccessibleAbilityManagerService::OnStop()
isReady_ = false;
isPublished_ = false;
SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
HILOG_INFO("AccessibleAbilityManagerService::OnStop OK.");
}
@@ -196,9 +196,9 @@ void AccessibleAbilityManagerService::OnAddSystemAbility(int32_t systemAbilityId
InitInnerResource();
isReady_ = true;
SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "true");
HILOG_DEBUG("AAMS is ready!");
RegisterShortKeyEvent();
PostDelayUnloadTask();
}), "OnAddSystemAbility");
}
@@ -227,7 +227,6 @@ void AccessibleAbilityManagerService::OnRemoveSystemAbility(int32_t systemAbilit
Singleton<AccessibilityWindowManager>::GetInstance().DeInit();
isReady_ = false;
SetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false");
}
}), "OnRemoveSystemAbility");
}
@@ -2226,5 +2225,58 @@ bool AccessibleAbilityManagerService::CheckWindowRegister(int32_t windowId)
}
return accountData->GetAccessibilityWindowConnection(windowId) != nullptr;
}
void AccessibleAbilityManagerService::PostDelayUnloadTask()
{
auto task = [=]() {
sptr<ISystemAbilityManager> systemAbilityManager =
SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
if (systemAbilityManager == nullptr) {
HILOG_ERROR("failed to get system ability mgr");
return;
}
if (!IsNeedUnload()) {
return;
}
int32_t ret = systemAbilityManager->UnloadSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
if (ret != ERR_OK) {
HILOG_ERROR("unload system ability failed");
return;
}
};
handler_->RemoveTask(DELAY_UNLOAD_TASK);
handler_->PostTask(task, DELAY_UNLOAD_TASK, UNLOAD_TASK_INTERNAL);
}
bool AccessibleAbilityManagerService::IsNeedUnload()
{
HILOG_DEBUG();
sptr<AccessibilityAccountData> accountData = GetCurrentAccountData();
if (!accountData) {
HILOG_ERROR("accountData is nullptr");
return true;
}
// do not unload when any extension is enabled
std::vector<std::string> enableAbilityList = accountData->GetEnabledAbilities();
if (enableAbilityList.size() != 0) {
return false;
}
if (!accountData->GetConfig()) {
return true;
}
if (accountData->GetConfig()->GetHighContrastTextState() != false ||
accountData->GetConfig()->GetDaltonizationState() != false ||
accountData->GetConfig()->GetInvertColorState() != false ||
accountData->GetConfig()->GetAnimationOffState() != false ||
accountData->GetConfig()->GetMouseKeyState() != false ||
accountData->GetConfig()->GetCaptionState() != false ||
accountData->GetConfig()->GetScreenMagnificationState() != false ||
accountData->GetConfig()->GetShortKeyState() != false ||
accountData->GetConfig()->GetBrightnessDiscount() != 1) {
return false;
}
return true;
}
} // namespace Accessibility
} // namespace OHOS
@@ -572,5 +572,9 @@ bool AccessibleAbilityManagerService::CheckWindowRegister(int32_t windowId)
(void)windowId;
return true;
}
void AccessibleAbilityManagerService::PostDelayUnloadTask()
{
}
} // namespace Accessibility
} // namespace OHOS