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