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#include "ui_appearance_ability_client.h"
17db372d24Sopenharmony_ci
18db372d24Sopenharmony_ci#include <string>
19db372d24Sopenharmony_ci#include "iservice_registry.h"
20db372d24Sopenharmony_ci#include "system_ability_definition.h"
21db372d24Sopenharmony_ci#include "ui_appearance_ability_proxy.h"
22db372d24Sopenharmony_ci#include "ui_appearance_log.h"
23db372d24Sopenharmony_ci#include "xcollie/xcollie.h"
24db372d24Sopenharmony_ci#include "xcollie/xcollie_define.h"
25db372d24Sopenharmony_ci
26db372d24Sopenharmony_cinamespace OHOS {
27db372d24Sopenharmony_cinamespace ArkUi::UiAppearance {
28db372d24Sopenharmony_cisptr<UiAppearanceAbilityClient> UiAppearanceAbilityClient::GetInstance()
29db372d24Sopenharmony_ci{
30db372d24Sopenharmony_ci    if (!instance_) {
31db372d24Sopenharmony_ci        std::lock_guard<std::mutex> autoLock(instanceLock_);
32db372d24Sopenharmony_ci        if (!instance_) {
33db372d24Sopenharmony_ci            instance_ = new UiAppearanceAbilityClient;
34db372d24Sopenharmony_ci            uiAppearanceServiceProxy_ = CreateUiAppearanceServiceProxy();
35db372d24Sopenharmony_ci        }
36db372d24Sopenharmony_ci    }
37db372d24Sopenharmony_ci    return instance_;
38db372d24Sopenharmony_ci}
39db372d24Sopenharmony_ci
40db372d24Sopenharmony_cisptr<UiAppearanceAbilityInterface> UiAppearanceAbilityClient::GetUiAppearanceServiceProxy()
41db372d24Sopenharmony_ci{
42db372d24Sopenharmony_ci    if (uiAppearanceServiceProxy_ == nullptr) {
43db372d24Sopenharmony_ci        LOGE("Redo CreateUiAppearanceServiceProxy");
44db372d24Sopenharmony_ci        uiAppearanceServiceProxy_ = CreateUiAppearanceServiceProxy();
45db372d24Sopenharmony_ci    }
46db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_;
47db372d24Sopenharmony_ci}
48db372d24Sopenharmony_ci
49db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::SetDarkMode(UiAppearanceAbilityInterface::DarkMode mode)
50db372d24Sopenharmony_ci{
51db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
52db372d24Sopenharmony_ci        LOGE("SetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
53db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
54db372d24Sopenharmony_ci    }
55db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_->SetDarkMode(mode);
56db372d24Sopenharmony_ci}
57db372d24Sopenharmony_ci
58db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::GetDarkMode()
59db372d24Sopenharmony_ci{
60db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
61db372d24Sopenharmony_ci        LOGE("GetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
62db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
63db372d24Sopenharmony_ci    }
64db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_->GetDarkMode();
65db372d24Sopenharmony_ci}
66db372d24Sopenharmony_ci
67db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::SetFontScale(std::string &fontScale)
68db372d24Sopenharmony_ci{
69db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
70db372d24Sopenharmony_ci        LOGE("SetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
71db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
72db372d24Sopenharmony_ci    }
73db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_->SetFontScale(fontScale);
74db372d24Sopenharmony_ci}
75db372d24Sopenharmony_ci
76db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::GetFontScale(std::string &fontScale)
77db372d24Sopenharmony_ci{
78db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
79db372d24Sopenharmony_ci        LOGE("GetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
80db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
81db372d24Sopenharmony_ci    }
82db372d24Sopenharmony_ci    int id = HiviewDFX::XCollie::GetInstance().SetTimer(
83db372d24Sopenharmony_ci        "GetFontScale", 10, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
84db372d24Sopenharmony_ci    auto res = uiAppearanceServiceProxy_->GetFontScale(fontScale);
85db372d24Sopenharmony_ci    HiviewDFX::XCollie::GetInstance().CancelTimer(id);
86db372d24Sopenharmony_ci    return res;
87db372d24Sopenharmony_ci}
88db372d24Sopenharmony_ci
89db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::SetFontWeightScale(std::string &fontWeightScale)
90db372d24Sopenharmony_ci{
91db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
92db372d24Sopenharmony_ci        LOGE("SetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
93db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
94db372d24Sopenharmony_ci    }
95db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_->SetFontWeightScale(fontWeightScale);
96db372d24Sopenharmony_ci}
97db372d24Sopenharmony_ci
98db372d24Sopenharmony_ciint32_t UiAppearanceAbilityClient::GetFontWeightScale(std::string &fontWeightScale)
99db372d24Sopenharmony_ci{
100db372d24Sopenharmony_ci    if (!GetUiAppearanceServiceProxy()) {
101db372d24Sopenharmony_ci        LOGE("GetDarkMode quit because redoing CreateUiAppearanceServiceProxy failed.");
102db372d24Sopenharmony_ci        return UiAppearanceAbilityInterface::ErrCode::SYS_ERR;
103db372d24Sopenharmony_ci    }
104db372d24Sopenharmony_ci    return uiAppearanceServiceProxy_->GetFontWeightScale(fontWeightScale);
105db372d24Sopenharmony_ci}
106db372d24Sopenharmony_ci
107db372d24Sopenharmony_cisptr<UiAppearanceAbilityInterface> UiAppearanceAbilityClient::CreateUiAppearanceServiceProxy()
108db372d24Sopenharmony_ci{
109db372d24Sopenharmony_ci    sptr<ISystemAbilityManager> systemAbilityManager =
110db372d24Sopenharmony_ci        SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
111db372d24Sopenharmony_ci    if (systemAbilityManager == nullptr) {
112db372d24Sopenharmony_ci        LOGE("Get SystemAbilityManager failed.");
113db372d24Sopenharmony_ci        return nullptr;
114db372d24Sopenharmony_ci    }
115db372d24Sopenharmony_ci
116db372d24Sopenharmony_ci    sptr<IRemoteObject> systemAbility = systemAbilityManager->GetSystemAbility(ARKUI_UI_APPEARANCE_SERVICE_ID);
117db372d24Sopenharmony_ci    if (systemAbility == nullptr) {
118db372d24Sopenharmony_ci        LOGE("Get SystemAbility failed.");
119db372d24Sopenharmony_ci        return nullptr;
120db372d24Sopenharmony_ci    }
121db372d24Sopenharmony_ci
122db372d24Sopenharmony_ci    deathRecipient_ = new UiAppearanceDeathRecipient;
123db372d24Sopenharmony_ci    systemAbility->AddDeathRecipient(deathRecipient_);
124db372d24Sopenharmony_ci    sptr<UiAppearanceAbilityInterface> uiAppearanceServiceProxy =
125db372d24Sopenharmony_ci        iface_cast<UiAppearanceAbilityInterface>(systemAbility);
126db372d24Sopenharmony_ci    if (uiAppearanceServiceProxy == nullptr) {
127db372d24Sopenharmony_ci        LOGE("Get uiAppearanceServiceProxy from SA failed.");
128db372d24Sopenharmony_ci        return nullptr;
129db372d24Sopenharmony_ci    }
130db372d24Sopenharmony_ci    LOGI("Get uiAppearanceServiceProxy successful.");
131db372d24Sopenharmony_ci    return uiAppearanceServiceProxy;
132db372d24Sopenharmony_ci}
133db372d24Sopenharmony_ci
134db372d24Sopenharmony_civoid UiAppearanceAbilityClient::OnRemoteSaDied(const wptr<IRemoteObject>& remote)
135db372d24Sopenharmony_ci{
136db372d24Sopenharmony_ci    // Used for new connections after the service may be disconnected.
137db372d24Sopenharmony_ci    uiAppearanceServiceProxy_ = CreateUiAppearanceServiceProxy();
138db372d24Sopenharmony_ci}
139db372d24Sopenharmony_ci
140db372d24Sopenharmony_civoid UiAppearanceDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& object)
141db372d24Sopenharmony_ci{
142db372d24Sopenharmony_ci    LOGI("UiAppearanceDeathRecipient on remote systemAbility died.");
143db372d24Sopenharmony_ci    UiAppearanceAbilityClient::GetInstance()->OnRemoteSaDied(object);
144db372d24Sopenharmony_ci}
145db372d24Sopenharmony_ci} // namespace ArkUi::UiAppearance
146db372d24Sopenharmony_ci} // namespace OHOS
147