1db372d24Sopenharmony_ci/*
2db372d24Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3db372d24Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4db372d24Sopenharmony_ci * you may not use this file except in compliance with the License.
5db372d24Sopenharmony_ci * You may obtain a copy of the License at
6db372d24Sopenharmony_ci *
7db372d24Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8db372d24Sopenharmony_ci *
9db372d24Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10db372d24Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11db372d24Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12db372d24Sopenharmony_ci * See the License for the specific language governing permissions and
13db372d24Sopenharmony_ci * limitations under the License.
14db372d24Sopenharmony_ci */
15db372d24Sopenharmony_ci
16db372d24Sopenharmony_ci#ifndef UI_APPEARANCE_ABILITY_H
17db372d24Sopenharmony_ci#define UI_APPEARANCE_ABILITY_H
18db372d24Sopenharmony_ci
19db372d24Sopenharmony_ci#include <cstdint>
20db372d24Sopenharmony_ci#include <string>
21db372d24Sopenharmony_ci
22db372d24Sopenharmony_ci#include "appmgr/app_mgr_proxy.h"
23db372d24Sopenharmony_ci#include "common_event_manager.h"
24db372d24Sopenharmony_ci#include "common_event_support.h"
25db372d24Sopenharmony_ci#include "system_ability.h"
26db372d24Sopenharmony_ci#include "ui_appearance_ability_stub.h"
27db372d24Sopenharmony_ci
28db372d24Sopenharmony_cinamespace OHOS {
29db372d24Sopenharmony_cinamespace ArkUi::UiAppearance {
30db372d24Sopenharmony_ciclass UserSwitchEventSubscriber : public EventFwk::CommonEventSubscriber {
31db372d24Sopenharmony_cipublic:
32db372d24Sopenharmony_ci    explicit UserSwitchEventSubscriber(const EventFwk::CommonEventSubscribeInfo& subscriberInfo,
33db372d24Sopenharmony_ci        const std::function<void(const int32_t)>& userSwitchCallback);
34db372d24Sopenharmony_ci    ~UserSwitchEventSubscriber() override = default;
35db372d24Sopenharmony_ci    void OnReceiveEvent(const EventFwk::CommonEventData& data) override;
36db372d24Sopenharmony_ci
37db372d24Sopenharmony_ciprivate:
38db372d24Sopenharmony_ci    std::function<void(const int32_t)> userSwitchCallback_;
39db372d24Sopenharmony_ci};
40db372d24Sopenharmony_ci
41db372d24Sopenharmony_ciclass UiAppearanceAbility : public SystemAbility, public UiAppearanceAbilityStub {
42db372d24Sopenharmony_ci    DECLARE_SYSTEM_ABILITY(UiAppearanceAbility);
43db372d24Sopenharmony_ci
44db372d24Sopenharmony_cipublic:
45db372d24Sopenharmony_ci    struct UiAppearanceParam {
46db372d24Sopenharmony_ci        DarkMode darkMode = DarkMode::ALWAYS_LIGHT;
47db372d24Sopenharmony_ci        std::string fontScale = "1";
48db372d24Sopenharmony_ci        std::string fontWeightScale = "1";
49db372d24Sopenharmony_ci    };
50db372d24Sopenharmony_ci    UiAppearanceAbility(int32_t saId, bool runOnCreate);
51db372d24Sopenharmony_ci    ~UiAppearanceAbility() = default;
52db372d24Sopenharmony_ci
53db372d24Sopenharmony_ci    int32_t SetDarkMode(DarkMode mode) override;
54db372d24Sopenharmony_ci    int32_t GetDarkMode() override;
55db372d24Sopenharmony_ci    int32_t GetFontScale(std::string& fontScale) override;
56db372d24Sopenharmony_ci    int32_t SetFontScale(std::string& fontScale) override;
57db372d24Sopenharmony_ci    int32_t GetFontWeightScale(std::string& fontWeightScale) override;
58db372d24Sopenharmony_ci    int32_t SetFontWeightScale(std::string& fontWeightScale) override;
59db372d24Sopenharmony_ci
60db372d24Sopenharmony_ciprotected:
61db372d24Sopenharmony_ci    void OnStart() override;
62db372d24Sopenharmony_ci    void OnStop() override;
63db372d24Sopenharmony_ci
64db372d24Sopenharmony_ci    void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
65db372d24Sopenharmony_ci    void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
66db372d24Sopenharmony_ci
67db372d24Sopenharmony_ciprivate:
68db372d24Sopenharmony_ci    sptr<AppExecFwk::IAppMgr> GetAppManagerInstance();
69db372d24Sopenharmony_ci    bool VerifyAccessToken(const std::string& permissionName);
70db372d24Sopenharmony_ci    void Init();
71db372d24Sopenharmony_ci    void SubscribeUserSwitchEvent();
72db372d24Sopenharmony_ci    bool IsUserExist(const int32_t userId);
73db372d24Sopenharmony_ci    bool UpdateConfiguration(const AppExecFwk::Configuration& configuration, const int32_t userId);
74db372d24Sopenharmony_ci    void DoCompatibleProcess();
75db372d24Sopenharmony_ci    int32_t GetCallingUserId();
76db372d24Sopenharmony_ci    std::vector<int32_t> GetUserIds();
77db372d24Sopenharmony_ci    void UserSwitchFunc(const int32_t userId);
78db372d24Sopenharmony_ci    void DoInitProcess();
79db372d24Sopenharmony_ci
80db372d24Sopenharmony_ci    bool GetParameterWrap(const std::string& paramName, std::string& value, const std::string& defaultValue);
81db372d24Sopenharmony_ci    bool GetParameterWrap(const std::string& paramName, std::string& value);
82db372d24Sopenharmony_ci    bool SetParameterWrap(const std::string& paramName, const std::string& value);
83db372d24Sopenharmony_ci
84db372d24Sopenharmony_ci    void UpdateCurrentUserConfiguration(const int32_t userId);
85db372d24Sopenharmony_ci    int32_t OnSetDarkMode(const int32_t userId, DarkMode mode);
86db372d24Sopenharmony_ci    UiAppearanceAbility::DarkMode InitGetDarkMode(const int32_t userId);
87db372d24Sopenharmony_ci    int32_t OnSetFontScale(const int32_t userId, std::string& fontScale);
88db372d24Sopenharmony_ci    int32_t OnSetFontWeightScale(const int32_t userId, std::string& fontWeightScale);
89db372d24Sopenharmony_ci    std::string DarkNodeConfigurationAssignUser(const int32_t userId);
90db372d24Sopenharmony_ci    std::string FontScaleConfigurationAssignUser(const int32_t userId);
91db372d24Sopenharmony_ci    std::string FontWeightScaleConfigurationAssignUser(const int32_t userId);
92db372d24Sopenharmony_ci    std::string DarkModeParamAssignUser(const int32_t userId);
93db372d24Sopenharmony_ci    std::string FontScaleParamAssignUser(const int32_t userId);
94db372d24Sopenharmony_ci    std::string FontWeightScaleParamAssignUser(const int32_t userId);
95db372d24Sopenharmony_ci
96db372d24Sopenharmony_ci    std::shared_ptr<UserSwitchEventSubscriber> userSwitchSubscriber_;
97db372d24Sopenharmony_ci    std::recursive_mutex usersParamMutex_;
98db372d24Sopenharmony_ci    std::map<int32_t, UiAppearanceParam> usersParam_;
99db372d24Sopenharmony_ci    std::atomic<bool> isNeedDoCompatibleProcess_ = false;
100db372d24Sopenharmony_ci    std::atomic<bool> isInitializationFinished_ = false;
101db372d24Sopenharmony_ci};
102db372d24Sopenharmony_ci} // namespace ArkUi::UiAppearance
103db372d24Sopenharmony_ci} // namespace OHOS
104db372d24Sopenharmony_ci#endif // UI_APPEARANCE_ABILITY_H
105