1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "account_manager.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include <securec.h> 19c29fa5a6Sopenharmony_ci#include <common_event_manager.h> 20c29fa5a6Sopenharmony_ci#include <common_event_support.h> 21c29fa5a6Sopenharmony_ci#ifdef SCREENLOCK_MANAGER_ENABLED 22c29fa5a6Sopenharmony_ci#include <screenlock_manager.h> 23c29fa5a6Sopenharmony_ci#endif // SCREENLOCK_MANAGER_ENABLED 24c29fa5a6Sopenharmony_ci#include <system_ability_definition.h> 25c29fa5a6Sopenharmony_ci 26c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 27c29fa5a6Sopenharmony_ci#include "display_event_monitor.h" 28c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 29c29fa5a6Sopenharmony_ci#include "setting_datashare.h" 30c29fa5a6Sopenharmony_ci#include "timer_manager.h" 31c29fa5a6Sopenharmony_ci 32c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN 33c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_SERVER 34c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 35c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "AccountManager" 36c29fa5a6Sopenharmony_ci 37c29fa5a6Sopenharmony_cinamespace OHOS { 38c29fa5a6Sopenharmony_cinamespace MMI { 39c29fa5a6Sopenharmony_cinamespace { 40c29fa5a6Sopenharmony_ciconstexpr int32_t MAIN_ACCOUNT_ID { 100 }; 41c29fa5a6Sopenharmony_ciconstexpr int32_t REPEAT_ONCE { 1 }; 42c29fa5a6Sopenharmony_ciconstexpr int32_t REPEAT_COOLING_TIME { 1000 }; 43c29fa5a6Sopenharmony_ciconstexpr size_t DEFAULT_BUFFER_LENGTH { 512 }; 44c29fa5a6Sopenharmony_ciconst std::string ACC_SHORTCUT_ENABLED { "accessibility_shortcut_enabled" }; 45c29fa5a6Sopenharmony_ciconst std::string ACC_SHORTCUT_ENABLED_ON_LOCK_SCREEN { "accessibility_shortcut_enabled_on_lock_screen" }; 46c29fa5a6Sopenharmony_ciconst std::string ACC_SHORTCUT_TIMEOUT { "accessibility_shortcut_timeout" }; 47c29fa5a6Sopenharmony_ciconst std::string SECURE_SETTING_URI_PROXY { 48c29fa5a6Sopenharmony_ci "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_%d?Proxy=true" }; 49c29fa5a6Sopenharmony_ci} 50c29fa5a6Sopenharmony_ci 51c29fa5a6Sopenharmony_cistd::shared_ptr<AccountManager> AccountManager::instance_; 52c29fa5a6Sopenharmony_cistd::mutex AccountManager::mutex_; 53c29fa5a6Sopenharmony_ci 54c29fa5a6Sopenharmony_cistd::shared_ptr<AccountManager> AccountManager::GetInstance() 55c29fa5a6Sopenharmony_ci{ 56c29fa5a6Sopenharmony_ci if (instance_ == nullptr) { 57c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> lock(mutex_); 58c29fa5a6Sopenharmony_ci if (instance_ == nullptr) { 59c29fa5a6Sopenharmony_ci instance_ = std::make_shared<AccountManager>(); 60c29fa5a6Sopenharmony_ci instance_->Initialize(); 61c29fa5a6Sopenharmony_ci } 62c29fa5a6Sopenharmony_ci } 63c29fa5a6Sopenharmony_ci return instance_; 64c29fa5a6Sopenharmony_ci} 65c29fa5a6Sopenharmony_ci 66c29fa5a6Sopenharmony_civoid AccountManager::CommonEventSubscriber::OnReceiveEvent(const EventFwk::CommonEventData &data) 67c29fa5a6Sopenharmony_ci{ 68c29fa5a6Sopenharmony_ci AccountManager::GetInstance()->OnCommonEvent(data); 69c29fa5a6Sopenharmony_ci} 70c29fa5a6Sopenharmony_ci 71c29fa5a6Sopenharmony_ciAccountManager::AccountSetting::AccountSetting(int32_t accountId) 72c29fa5a6Sopenharmony_ci : accountId_(accountId) 73c29fa5a6Sopenharmony_ci{ 74c29fa5a6Sopenharmony_ci InitializeSetting(); 75c29fa5a6Sopenharmony_ci} 76c29fa5a6Sopenharmony_ci 77c29fa5a6Sopenharmony_ciAccountManager::AccountSetting::~AccountSetting() 78c29fa5a6Sopenharmony_ci{ 79c29fa5a6Sopenharmony_ci if (timerId_ >= 0) { 80c29fa5a6Sopenharmony_ci TimerMgr->RemoveTimer(timerId_); 81c29fa5a6Sopenharmony_ci } 82c29fa5a6Sopenharmony_ci auto &setting = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID); 83c29fa5a6Sopenharmony_ci if (switchObserver_ != nullptr) { 84c29fa5a6Sopenharmony_ci setting.UnregisterObserver(switchObserver_); 85c29fa5a6Sopenharmony_ci } 86c29fa5a6Sopenharmony_ci if (onScreenLockedSwitchObserver_ != nullptr) { 87c29fa5a6Sopenharmony_ci setting.UnregisterObserver(onScreenLockedSwitchObserver_); 88c29fa5a6Sopenharmony_ci } 89c29fa5a6Sopenharmony_ci if (configObserver_ != nullptr) { 90c29fa5a6Sopenharmony_ci setting.UnregisterObserver(configObserver_); 91c29fa5a6Sopenharmony_ci } 92c29fa5a6Sopenharmony_ci} 93c29fa5a6Sopenharmony_ci 94c29fa5a6Sopenharmony_ciAccountManager::AccountSetting::AccountSetting(const AccountSetting &other) 95c29fa5a6Sopenharmony_ci : accountId_(other.accountId_), accShortcutTimeout_(other.accShortcutTimeout_), 96c29fa5a6Sopenharmony_ci accShortcutEnabled_(other.accShortcutEnabled_), 97c29fa5a6Sopenharmony_ci accShortcutEnabledOnScreenLocked_(other.accShortcutEnabledOnScreenLocked_) 98c29fa5a6Sopenharmony_ci{} 99c29fa5a6Sopenharmony_ci 100c29fa5a6Sopenharmony_ciAccountManager::AccountSetting& AccountManager::AccountSetting::operator=(const AccountSetting &other) 101c29fa5a6Sopenharmony_ci{ 102c29fa5a6Sopenharmony_ci accountId_ = other.accountId_; 103c29fa5a6Sopenharmony_ci accShortcutTimeout_ = other.accShortcutTimeout_; 104c29fa5a6Sopenharmony_ci accShortcutEnabled_ = other.accShortcutEnabled_; 105c29fa5a6Sopenharmony_ci accShortcutEnabledOnScreenLocked_ = other.accShortcutEnabledOnScreenLocked_; 106c29fa5a6Sopenharmony_ci return *this; 107c29fa5a6Sopenharmony_ci} 108c29fa5a6Sopenharmony_ci 109c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::AccShortcutTimeout(int32_t accountId, const std::string &key) 110c29fa5a6Sopenharmony_ci{ 111c29fa5a6Sopenharmony_ci auto accountMgr = ACCOUNT_MGR; 112c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { accountMgr->lock_ }; 113c29fa5a6Sopenharmony_ci if (auto iter = accountMgr->accounts_.find(accountId); iter != accountMgr->accounts_.end()) { 114c29fa5a6Sopenharmony_ci iter->second->OnAccShortcutTimeoutChanged(key); 115c29fa5a6Sopenharmony_ci } else { 116c29fa5a6Sopenharmony_ci MMI_HILOGW("No account(%d)", accountId); 117c29fa5a6Sopenharmony_ci } 118c29fa5a6Sopenharmony_ci} 119c29fa5a6Sopenharmony_ci 120c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::AccShortcutEnabled(int32_t accountId, const std::string &key) 121c29fa5a6Sopenharmony_ci{ 122c29fa5a6Sopenharmony_ci auto accountMgr = ACCOUNT_MGR; 123c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { accountMgr->lock_ }; 124c29fa5a6Sopenharmony_ci if (auto iter = accountMgr->accounts_.find(accountId); iter != accountMgr->accounts_.end()) { 125c29fa5a6Sopenharmony_ci iter->second->OnAccShortcutEnabled(key); 126c29fa5a6Sopenharmony_ci } else { 127c29fa5a6Sopenharmony_ci MMI_HILOGW("No account(%{public}d)", accountId); 128c29fa5a6Sopenharmony_ci } 129c29fa5a6Sopenharmony_ci} 130c29fa5a6Sopenharmony_ci 131c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::AccShortcutEnabledOnScreenLocked(int32_t accountId, const std::string &key) 132c29fa5a6Sopenharmony_ci{ 133c29fa5a6Sopenharmony_ci auto accountMgr = ACCOUNT_MGR; 134c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { accountMgr->lock_ }; 135c29fa5a6Sopenharmony_ci if (auto iter = accountMgr->accounts_.find(accountId); iter != accountMgr->accounts_.end()) { 136c29fa5a6Sopenharmony_ci iter->second->OnAccShortcutEnabledOnScreenLocked(key); 137c29fa5a6Sopenharmony_ci } else { 138c29fa5a6Sopenharmony_ci MMI_HILOGW("No account(%{public}d)", accountId); 139c29fa5a6Sopenharmony_ci } 140c29fa5a6Sopenharmony_ci} 141c29fa5a6Sopenharmony_ci 142c29fa5a6Sopenharmony_cisptr<SettingObserver> AccountManager::AccountSetting::RegisterSettingObserver( 143c29fa5a6Sopenharmony_ci const std::string &key, SettingObserver::UpdateFunc onUpdate) 144c29fa5a6Sopenharmony_ci{ 145c29fa5a6Sopenharmony_ci char buf[DEFAULT_BUFFER_LENGTH] {}; 146c29fa5a6Sopenharmony_ci if (sprintf_s(buf, sizeof(buf), SECURE_SETTING_URI_PROXY.c_str(), accountId_) < 0) { 147c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to format URI"); 148c29fa5a6Sopenharmony_ci return nullptr; 149c29fa5a6Sopenharmony_ci } 150c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting] Registering observer of '%{public}s' in %{public}s", key.c_str(), buf); 151c29fa5a6Sopenharmony_ci auto &settingHelper = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID); 152c29fa5a6Sopenharmony_ci sptr<SettingObserver> settingObserver = settingHelper.CreateObserver(key, onUpdate); 153c29fa5a6Sopenharmony_ci ErrCode ret = settingHelper.RegisterObserver(settingObserver, std::string(buf)); 154c29fa5a6Sopenharmony_ci if (ret != ERR_OK) { 155c29fa5a6Sopenharmony_ci MMI_HILOGE("[AccountSetting] Failed to register '%{public}s' observer, error:%{public}d", 156c29fa5a6Sopenharmony_ci key.c_str(), ret); 157c29fa5a6Sopenharmony_ci return nullptr; 158c29fa5a6Sopenharmony_ci } 159c29fa5a6Sopenharmony_ci return settingObserver; 160c29fa5a6Sopenharmony_ci} 161c29fa5a6Sopenharmony_ci 162c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::InitializeSetting() 163c29fa5a6Sopenharmony_ci{ 164c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 165c29fa5a6Sopenharmony_ci if (switchObserver_ == nullptr) { 166c29fa5a6Sopenharmony_ci switchObserver_ = RegisterSettingObserver(ACC_SHORTCUT_ENABLED, 167c29fa5a6Sopenharmony_ci [accountId = accountId_](const std::string &key) { 168c29fa5a6Sopenharmony_ci AccountManager::AccountSetting::AccShortcutEnabled(accountId, key); 169c29fa5a6Sopenharmony_ci }); 170c29fa5a6Sopenharmony_ci } 171c29fa5a6Sopenharmony_ci if (onScreenLockedSwitchObserver_ == nullptr) { 172c29fa5a6Sopenharmony_ci onScreenLockedSwitchObserver_ = RegisterSettingObserver(ACC_SHORTCUT_ENABLED_ON_LOCK_SCREEN, 173c29fa5a6Sopenharmony_ci [accountId = accountId_](const std::string &key) { 174c29fa5a6Sopenharmony_ci AccountManager::AccountSetting::AccShortcutEnabledOnScreenLocked(accountId, key); 175c29fa5a6Sopenharmony_ci }); 176c29fa5a6Sopenharmony_ci } 177c29fa5a6Sopenharmony_ci if (configObserver_ == nullptr) { 178c29fa5a6Sopenharmony_ci configObserver_ = RegisterSettingObserver(ACC_SHORTCUT_TIMEOUT, 179c29fa5a6Sopenharmony_ci [accountId = accountId_](const std::string &key) { 180c29fa5a6Sopenharmony_ci AccountManager::AccountSetting::AccShortcutTimeout(accountId, key); 181c29fa5a6Sopenharmony_ci }); 182c29fa5a6Sopenharmony_ci } 183c29fa5a6Sopenharmony_ci if ((switchObserver_ == nullptr) || (onScreenLockedSwitchObserver_ == nullptr) || (configObserver_ == nullptr)) { 184c29fa5a6Sopenharmony_ci timerId_ = TimerMgr->AddTimer(REPEAT_COOLING_TIME, REPEAT_ONCE, [this]() { 185c29fa5a6Sopenharmony_ci InitializeSetting(); 186c29fa5a6Sopenharmony_ci }); 187c29fa5a6Sopenharmony_ci if (timerId_ < 0) { 188c29fa5a6Sopenharmony_ci MMI_HILOGE("AddTimer fail, setting will not work"); 189c29fa5a6Sopenharmony_ci } 190c29fa5a6Sopenharmony_ci } else { 191c29fa5a6Sopenharmony_ci timerId_ = -1; 192c29fa5a6Sopenharmony_ci } 193c29fa5a6Sopenharmony_ci} 194c29fa5a6Sopenharmony_ci 195c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::OnAccShortcutTimeoutChanged(const std::string &key) 196c29fa5a6Sopenharmony_ci{ 197c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting][%d] Setting '%s' has changed", GetAccountId(), key.c_str()); 198c29fa5a6Sopenharmony_ci ReadLongPressTime(); 199c29fa5a6Sopenharmony_ci} 200c29fa5a6Sopenharmony_ci 201c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::OnAccShortcutEnabled(const std::string &key) 202c29fa5a6Sopenharmony_ci{ 203c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting][%d] Setting '%s' has changed", GetAccountId(), key.c_str()); 204c29fa5a6Sopenharmony_ci accShortcutEnabled_ = ReadSwitchStatus(key, accShortcutEnabled_); 205c29fa5a6Sopenharmony_ci} 206c29fa5a6Sopenharmony_ci 207c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::OnAccShortcutEnabledOnScreenLocked(const std::string &key) 208c29fa5a6Sopenharmony_ci{ 209c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting][%d] Setting '%{public}s' has changed", GetAccountId(), key.c_str()); 210c29fa5a6Sopenharmony_ci accShortcutEnabledOnScreenLocked_ = ReadSwitchStatus(key, accShortcutEnabledOnScreenLocked_); 211c29fa5a6Sopenharmony_ci} 212c29fa5a6Sopenharmony_ci 213c29fa5a6Sopenharmony_cibool AccountManager::AccountSetting::ReadSwitchStatus(const std::string &key, bool currentSwitchStatus) 214c29fa5a6Sopenharmony_ci{ 215c29fa5a6Sopenharmony_ci if (accountId_ < 0) { 216c29fa5a6Sopenharmony_ci return false; 217c29fa5a6Sopenharmony_ci } 218c29fa5a6Sopenharmony_ci char buf[DEFAULT_BUFFER_LENGTH] {}; 219c29fa5a6Sopenharmony_ci if (sprintf_s(buf, sizeof(buf), SECURE_SETTING_URI_PROXY.c_str(), accountId_) < 0) { 220c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to format URI"); 221c29fa5a6Sopenharmony_ci return currentSwitchStatus; 222c29fa5a6Sopenharmony_ci } 223c29fa5a6Sopenharmony_ci bool switchOn = true; 224c29fa5a6Sopenharmony_ci auto ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).GetBoolValue( 225c29fa5a6Sopenharmony_ci key, switchOn, std::string(buf)); 226c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 227c29fa5a6Sopenharmony_ci MMI_HILOGE("[AccountSetting] Failed to acquire '%{public}s', error:%{public}d", key.c_str(), ret); 228c29fa5a6Sopenharmony_ci return currentSwitchStatus; 229c29fa5a6Sopenharmony_ci } 230c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting] '%{public}s' switch %{public}s", key.c_str(), switchOn ? "on" : "off"); 231c29fa5a6Sopenharmony_ci return switchOn; 232c29fa5a6Sopenharmony_ci} 233c29fa5a6Sopenharmony_ci 234c29fa5a6Sopenharmony_civoid AccountManager::AccountSetting::ReadLongPressTime() 235c29fa5a6Sopenharmony_ci{ 236c29fa5a6Sopenharmony_ci if (accountId_ < 0) { 237c29fa5a6Sopenharmony_ci return; 238c29fa5a6Sopenharmony_ci } 239c29fa5a6Sopenharmony_ci char buf[DEFAULT_BUFFER_LENGTH] {}; 240c29fa5a6Sopenharmony_ci if (sprintf_s(buf, sizeof(buf), SECURE_SETTING_URI_PROXY.c_str(), accountId_) < 0) { 241c29fa5a6Sopenharmony_ci MMI_HILOGE("Failed to format URI"); 242c29fa5a6Sopenharmony_ci return; 243c29fa5a6Sopenharmony_ci } 244c29fa5a6Sopenharmony_ci int32_t longPressTime {}; 245c29fa5a6Sopenharmony_ci auto ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).GetIntValue( 246c29fa5a6Sopenharmony_ci ACC_SHORTCUT_TIMEOUT, longPressTime, std::string(buf)); 247c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 248c29fa5a6Sopenharmony_ci MMI_HILOGE("[AccountSetting] Failed to acquire '%{public}s', error:%{public}d", 249c29fa5a6Sopenharmony_ci ACC_SHORTCUT_TIMEOUT.c_str(), ret); 250c29fa5a6Sopenharmony_ci return; 251c29fa5a6Sopenharmony_ci } 252c29fa5a6Sopenharmony_ci accShortcutTimeout_ = longPressTime; 253c29fa5a6Sopenharmony_ci MMI_HILOGI("[AccountSetting] '%{public}s' was set to %{public}d", 254c29fa5a6Sopenharmony_ci ACC_SHORTCUT_TIMEOUT.c_str(), accShortcutTimeout_); 255c29fa5a6Sopenharmony_ci} 256c29fa5a6Sopenharmony_ci 257c29fa5a6Sopenharmony_ciAccountManager::AccountManager() 258c29fa5a6Sopenharmony_ci{ 259c29fa5a6Sopenharmony_ci handlers_ = { 260c29fa5a6Sopenharmony_ci { 261c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_USER_ADDED, 262c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 263c29fa5a6Sopenharmony_ci OnAddUser(data); 264c29fa5a6Sopenharmony_ci }, 265c29fa5a6Sopenharmony_ci }, { 266c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED, 267c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 268c29fa5a6Sopenharmony_ci OnRemoveUser(data); 269c29fa5a6Sopenharmony_ci }, 270c29fa5a6Sopenharmony_ci }, { 271c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED, 272c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 273c29fa5a6Sopenharmony_ci OnSwitchUser(data); 274c29fa5a6Sopenharmony_ci }, 275c29fa5a6Sopenharmony_ci }, { 276c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON, 277c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 278c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 279c29fa5a6Sopenharmony_ci DISPLAY_MONITOR->SetScreenStatus(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON); 280c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 281c29fa5a6Sopenharmony_ci }, 282c29fa5a6Sopenharmony_ci }, { 283c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF, 284c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 285c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 286c29fa5a6Sopenharmony_ci DISPLAY_MONITOR->SetScreenStatus(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF); 287c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 288c29fa5a6Sopenharmony_ci }, 289c29fa5a6Sopenharmony_ci }, { 290c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_LOCKED, 291c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 292c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 293c29fa5a6Sopenharmony_ci DISPLAY_MONITOR->SetScreenLocked(true); 294c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 295c29fa5a6Sopenharmony_ci }, 296c29fa5a6Sopenharmony_ci }, { 297c29fa5a6Sopenharmony_ci EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED, 298c29fa5a6Sopenharmony_ci [this](const EventFwk::CommonEventData &data) { 299c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 300c29fa5a6Sopenharmony_ci DISPLAY_MONITOR->SetScreenLocked(false); 301c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 302c29fa5a6Sopenharmony_ci }, 303c29fa5a6Sopenharmony_ci } 304c29fa5a6Sopenharmony_ci }; 305c29fa5a6Sopenharmony_ci} 306c29fa5a6Sopenharmony_ci 307c29fa5a6Sopenharmony_ciAccountManager::~AccountManager() 308c29fa5a6Sopenharmony_ci{ 309c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { lock_ }; 310c29fa5a6Sopenharmony_ci UnsubscribeCommonEvent(); 311c29fa5a6Sopenharmony_ci if (timerId_ >= 0) { 312c29fa5a6Sopenharmony_ci TimerMgr->RemoveTimer(timerId_); 313c29fa5a6Sopenharmony_ci } 314c29fa5a6Sopenharmony_ci accounts_.clear(); 315c29fa5a6Sopenharmony_ci} 316c29fa5a6Sopenharmony_ci 317c29fa5a6Sopenharmony_civoid AccountManager::Initialize() 318c29fa5a6Sopenharmony_ci{ 319c29fa5a6Sopenharmony_ci MMI_HILOGI("Initialize account manager"); 320c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { lock_ }; 321c29fa5a6Sopenharmony_ci SetupMainAccount(); 322c29fa5a6Sopenharmony_ci SubscribeCommonEvent(); 323c29fa5a6Sopenharmony_ci#ifdef SCREENLOCK_MANAGER_ENABLED 324c29fa5a6Sopenharmony_ci InitializeScreenLockStatus(); 325c29fa5a6Sopenharmony_ci#endif // SCREENLOCK_MANAGER_ENABLED 326c29fa5a6Sopenharmony_ci} 327c29fa5a6Sopenharmony_ci 328c29fa5a6Sopenharmony_ciAccountManager::AccountSetting AccountManager::GetCurrentAccountSetting() 329c29fa5a6Sopenharmony_ci{ 330c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { lock_ }; 331c29fa5a6Sopenharmony_ci if (auto iter = accounts_.find(currentAccountId_); iter != accounts_.end()) { 332c29fa5a6Sopenharmony_ci return *iter->second; 333c29fa5a6Sopenharmony_ci } 334c29fa5a6Sopenharmony_ci auto [iter, _] = accounts_.emplace(currentAccountId_, std::make_unique<AccountSetting>(currentAccountId_)); 335c29fa5a6Sopenharmony_ci return *iter->second; 336c29fa5a6Sopenharmony_ci} 337c29fa5a6Sopenharmony_ci 338c29fa5a6Sopenharmony_ci#ifdef SCREENLOCK_MANAGER_ENABLED 339c29fa5a6Sopenharmony_civoid AccountManager::InitializeScreenLockStatus() 340c29fa5a6Sopenharmony_ci{ 341c29fa5a6Sopenharmony_ci MMI_HILOGI("Initialize screen lock status"); 342c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD 343c29fa5a6Sopenharmony_ci auto screenLockPtr = ScreenLock::ScreenLockManager::GetInstance(); 344c29fa5a6Sopenharmony_ci CHKPV(screenLockPtr); 345c29fa5a6Sopenharmony_ci DISPLAY_MONITOR->SetScreenLocked(screenLockPtr->IsScreenLocked()); 346c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD 347c29fa5a6Sopenharmony_ci} 348c29fa5a6Sopenharmony_ci#endif // SCREENLOCK_MANAGER_ENABLED 349c29fa5a6Sopenharmony_ci 350c29fa5a6Sopenharmony_civoid AccountManager::SubscribeCommonEvent() 351c29fa5a6Sopenharmony_ci{ 352c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 353c29fa5a6Sopenharmony_ci EventFwk::MatchingSkills matchingSkills; 354c29fa5a6Sopenharmony_ci 355c29fa5a6Sopenharmony_ci for (auto &item : handlers_) { 356c29fa5a6Sopenharmony_ci MMI_HILOGD("Add event: %{public}s", item.first.c_str()); 357c29fa5a6Sopenharmony_ci matchingSkills.AddEvent(item.first); 358c29fa5a6Sopenharmony_ci } 359c29fa5a6Sopenharmony_ci EventFwk::CommonEventSubscribeInfo subscribeInfo { matchingSkills }; 360c29fa5a6Sopenharmony_ci subscriber_ = std::make_shared<CommonEventSubscriber>(subscribeInfo); 361c29fa5a6Sopenharmony_ci 362c29fa5a6Sopenharmony_ci if (EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber_)) { 363c29fa5a6Sopenharmony_ci timerId_ = -1; 364c29fa5a6Sopenharmony_ci MMI_HILOGI("SubscribeCommonEvent succeed"); 365c29fa5a6Sopenharmony_ci return; 366c29fa5a6Sopenharmony_ci } 367c29fa5a6Sopenharmony_ci subscriber_ = nullptr; 368c29fa5a6Sopenharmony_ci MMI_HILOGI("SubscribeCommonEvent fail, retry later"); 369c29fa5a6Sopenharmony_ci timerId_ = TimerMgr->AddTimer(REPEAT_COOLING_TIME, REPEAT_ONCE, [this]() { 370c29fa5a6Sopenharmony_ci SubscribeCommonEvent(); 371c29fa5a6Sopenharmony_ci }); 372c29fa5a6Sopenharmony_ci if (timerId_ < 0) { 373c29fa5a6Sopenharmony_ci MMI_HILOGE("AddTimer fail, SubscribeCommonEvent fail"); 374c29fa5a6Sopenharmony_ci } 375c29fa5a6Sopenharmony_ci} 376c29fa5a6Sopenharmony_ci 377c29fa5a6Sopenharmony_civoid AccountManager::UnsubscribeCommonEvent() 378c29fa5a6Sopenharmony_ci{ 379c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 380c29fa5a6Sopenharmony_ci if (subscriber_ != nullptr) { 381c29fa5a6Sopenharmony_ci if (!EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriber_)) { 382c29fa5a6Sopenharmony_ci MMI_HILOGE("UnSubscribeCommonEvent fail"); 383c29fa5a6Sopenharmony_ci } 384c29fa5a6Sopenharmony_ci subscriber_ = nullptr; 385c29fa5a6Sopenharmony_ci } 386c29fa5a6Sopenharmony_ci} 387c29fa5a6Sopenharmony_ci 388c29fa5a6Sopenharmony_civoid AccountManager::SetupMainAccount() 389c29fa5a6Sopenharmony_ci{ 390c29fa5a6Sopenharmony_ci MMI_HILOGI("Setup main account(%{public}d)", MAIN_ACCOUNT_ID); 391c29fa5a6Sopenharmony_ci currentAccountId_ = MAIN_ACCOUNT_ID; 392c29fa5a6Sopenharmony_ci auto [_, isNew] = accounts_.emplace(MAIN_ACCOUNT_ID, std::make_unique<AccountSetting>(MAIN_ACCOUNT_ID)); 393c29fa5a6Sopenharmony_ci if (!isNew) { 394c29fa5a6Sopenharmony_ci MMI_HILOGW("Account(%{public}d) has existed", MAIN_ACCOUNT_ID); 395c29fa5a6Sopenharmony_ci } 396c29fa5a6Sopenharmony_ci} 397c29fa5a6Sopenharmony_ci 398c29fa5a6Sopenharmony_civoid AccountManager::OnCommonEvent(const EventFwk::CommonEventData &data) 399c29fa5a6Sopenharmony_ci{ 400c29fa5a6Sopenharmony_ci std::lock_guard<std::mutex> guard { lock_ }; 401c29fa5a6Sopenharmony_ci std::string action = data.GetWant().GetAction(); 402c29fa5a6Sopenharmony_ci MMI_HILOGI("Receive common event: %{public}s", action.c_str()); 403c29fa5a6Sopenharmony_ci if (auto iter = handlers_.find(action); iter != handlers_.end()) { 404c29fa5a6Sopenharmony_ci iter->second(data); 405c29fa5a6Sopenharmony_ci } else { 406c29fa5a6Sopenharmony_ci MMI_HILOGW("Ignore event: %{public}s", action.c_str()); 407c29fa5a6Sopenharmony_ci } 408c29fa5a6Sopenharmony_ci} 409c29fa5a6Sopenharmony_ci 410c29fa5a6Sopenharmony_civoid AccountManager::OnAddUser(const EventFwk::CommonEventData &data) 411c29fa5a6Sopenharmony_ci{ 412c29fa5a6Sopenharmony_ci int32_t accountId = data.GetCode(); 413c29fa5a6Sopenharmony_ci MMI_HILOGI("Add account(%d)", accountId); 414c29fa5a6Sopenharmony_ci auto [_, isNew] = accounts_.emplace(accountId, std::make_unique<AccountSetting>(accountId)); 415c29fa5a6Sopenharmony_ci if (!isNew) { 416c29fa5a6Sopenharmony_ci MMI_HILOGW("Account(%d) has existed", accountId); 417c29fa5a6Sopenharmony_ci } 418c29fa5a6Sopenharmony_ci} 419c29fa5a6Sopenharmony_ci 420c29fa5a6Sopenharmony_civoid AccountManager::OnRemoveUser(const EventFwk::CommonEventData &data) 421c29fa5a6Sopenharmony_ci{ 422c29fa5a6Sopenharmony_ci int32_t accountId = data.GetCode(); 423c29fa5a6Sopenharmony_ci MMI_HILOGI("Remove account(%d)", accountId); 424c29fa5a6Sopenharmony_ci if (auto iter = accounts_.find(accountId); iter != accounts_.end()) { 425c29fa5a6Sopenharmony_ci accounts_.erase(iter); 426c29fa5a6Sopenharmony_ci MMI_HILOGI("Account(%d) has been removed", accountId); 427c29fa5a6Sopenharmony_ci } else { 428c29fa5a6Sopenharmony_ci MMI_HILOGW("No account(%d)", accountId); 429c29fa5a6Sopenharmony_ci } 430c29fa5a6Sopenharmony_ci} 431c29fa5a6Sopenharmony_ci 432c29fa5a6Sopenharmony_civoid AccountManager::OnSwitchUser(const EventFwk::CommonEventData &data) 433c29fa5a6Sopenharmony_ci{ 434c29fa5a6Sopenharmony_ci int32_t accountId = data.GetCode(); 435c29fa5a6Sopenharmony_ci MMI_HILOGI("Switch to account(%d)", accountId); 436c29fa5a6Sopenharmony_ci if (currentAccountId_ != accountId) { 437c29fa5a6Sopenharmony_ci if (auto iter = accounts_.find(accountId); iter == accounts_.end()) { 438c29fa5a6Sopenharmony_ci accounts_.emplace(accountId, std::make_unique<AccountSetting>(accountId)); 439c29fa5a6Sopenharmony_ci } 440c29fa5a6Sopenharmony_ci currentAccountId_ = accountId; 441c29fa5a6Sopenharmony_ci MMI_HILOGI("Switched to account(%d)", currentAccountId_); 442c29fa5a6Sopenharmony_ci } 443c29fa5a6Sopenharmony_ci} 444c29fa5a6Sopenharmony_ci} // namespace MMI 445c29fa5a6Sopenharmony_ci} // namespace OHOS 446