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