1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License. 5e0dac50fSopenharmony_ci * You may obtain a copy of the License at 6e0dac50fSopenharmony_ci * 7e0dac50fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e0dac50fSopenharmony_ci * 9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and 13e0dac50fSopenharmony_ci * limitations under the License. 14e0dac50fSopenharmony_ci */ 15e0dac50fSopenharmony_ci 16e0dac50fSopenharmony_ci#include "root_scene.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include <bundlemgr/launcher_service.h> 19e0dac50fSopenharmony_ci#include <event_handler.h> 20e0dac50fSopenharmony_ci#include <input_manager.h> 21e0dac50fSopenharmony_ci#include <iremote_stub.h> 22e0dac50fSopenharmony_ci#include <transaction/rs_interfaces.h> 23e0dac50fSopenharmony_ci#include <ui_content.h> 24e0dac50fSopenharmony_ci#include <viewport_config.h> 25e0dac50fSopenharmony_ci 26e0dac50fSopenharmony_ci#include "app_mgr_client.h" 27e0dac50fSopenharmony_ci#include "fold_screen_state_internel.h" 28e0dac50fSopenharmony_ci#include "input_transfer_station.h" 29e0dac50fSopenharmony_ci#include "singleton.h" 30e0dac50fSopenharmony_ci#include "singleton_container.h" 31e0dac50fSopenharmony_ci 32e0dac50fSopenharmony_ci#include "intention_event_manager.h" 33e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 34e0dac50fSopenharmony_ci 35e0dac50fSopenharmony_cinamespace OHOS { 36e0dac50fSopenharmony_cinamespace Rosen { 37e0dac50fSopenharmony_cinamespace { 38e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_WINDOW, "RootScene" }; 39e0dac50fSopenharmony_ciconst std::string INPUT_AND_VSYNC_THREAD = "InputAndVsyncThread"; 40e0dac50fSopenharmony_ci 41e0dac50fSopenharmony_ciclass BundleStatusCallback : public IRemoteStub<AppExecFwk::IBundleStatusCallback> { 42e0dac50fSopenharmony_cipublic: 43e0dac50fSopenharmony_ci explicit BundleStatusCallback(RootScene* rootScene) : rootScene_(rootScene) {} 44e0dac50fSopenharmony_ci virtual ~BundleStatusCallback() = default; 45e0dac50fSopenharmony_ci 46e0dac50fSopenharmony_ci void OnBundleStateChanged(const uint8_t installType, 47e0dac50fSopenharmony_ci const int32_t resultCode, const std::string& resultMsg, const std::string& bundleName) override {} 48e0dac50fSopenharmony_ci 49e0dac50fSopenharmony_ci void OnBundleAdded(const std::string& bundleName, const int userId) override 50e0dac50fSopenharmony_ci { 51e0dac50fSopenharmony_ci rootScene_->OnBundleUpdated(bundleName); 52e0dac50fSopenharmony_ci } 53e0dac50fSopenharmony_ci 54e0dac50fSopenharmony_ci void OnBundleUpdated(const std::string& bundleName, const int userId) override 55e0dac50fSopenharmony_ci { 56e0dac50fSopenharmony_ci rootScene_->OnBundleUpdated(bundleName); 57e0dac50fSopenharmony_ci } 58e0dac50fSopenharmony_ci 59e0dac50fSopenharmony_ci void OnBundleRemoved(const std::string& bundleName, const int userId) override {} 60e0dac50fSopenharmony_ci 61e0dac50fSopenharmony_ciprivate: 62e0dac50fSopenharmony_ci RootScene* rootScene_; 63e0dac50fSopenharmony_ci}; 64e0dac50fSopenharmony_ci} // namespace 65e0dac50fSopenharmony_ci 66e0dac50fSopenharmony_cisptr<RootScene> RootScene::staticRootScene_; 67e0dac50fSopenharmony_cistd::function<void(const std::shared_ptr<AppExecFwk::Configuration>&)> RootScene::configurationUpdatedCallback_; 68e0dac50fSopenharmony_ci 69e0dac50fSopenharmony_ciRootScene::RootScene() 70e0dac50fSopenharmony_ci{ 71e0dac50fSopenharmony_ci launcherService_ = new AppExecFwk::LauncherService(); 72e0dac50fSopenharmony_ci if (!launcherService_->RegisterCallback(new BundleStatusCallback(this))) { 73e0dac50fSopenharmony_ci WLOGFE("Failed to register bundle status callback."); 74e0dac50fSopenharmony_ci } 75e0dac50fSopenharmony_ci 76e0dac50fSopenharmony_ci NodeId nodeId = 0; 77e0dac50fSopenharmony_ci vsyncStation_ = std::make_shared<VsyncStation>(nodeId); 78e0dac50fSopenharmony_ci} 79e0dac50fSopenharmony_ci 80e0dac50fSopenharmony_ciRootScene::~RootScene() 81e0dac50fSopenharmony_ci{ 82e0dac50fSopenharmony_ci uiContent_ = nullptr; 83e0dac50fSopenharmony_ci} 84e0dac50fSopenharmony_ci 85e0dac50fSopenharmony_civoid RootScene::LoadContent(const std::string& contentUrl, napi_env env, napi_value storage, 86e0dac50fSopenharmony_ci AbilityRuntime::Context* context) 87e0dac50fSopenharmony_ci{ 88e0dac50fSopenharmony_ci if (context == nullptr) { 89e0dac50fSopenharmony_ci WLOGFE("context is nullptr!"); 90e0dac50fSopenharmony_ci return; 91e0dac50fSopenharmony_ci } 92e0dac50fSopenharmony_ci uiContent_ = Ace::UIContent::Create(context, reinterpret_cast<NativeEngine*>(env)); 93e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 94e0dac50fSopenharmony_ci WLOGFE("uiContent_ is nullptr!"); 95e0dac50fSopenharmony_ci return; 96e0dac50fSopenharmony_ci } 97e0dac50fSopenharmony_ci 98e0dac50fSopenharmony_ci uiContent_->Initialize(this, contentUrl, storage); 99e0dac50fSopenharmony_ci uiContent_->Foreground(); 100e0dac50fSopenharmony_ci uiContent_->SetFrameLayoutFinishCallback(std::move(frameLayoutFinishCb_)); 101e0dac50fSopenharmony_ci RegisterInputEventListener(); 102e0dac50fSopenharmony_ci} 103e0dac50fSopenharmony_ci 104e0dac50fSopenharmony_civoid RootScene::SetDisplayOrientation(int32_t orientation) 105e0dac50fSopenharmony_ci{ 106e0dac50fSopenharmony_ci orientation_ = orientation; 107e0dac50fSopenharmony_ci} 108e0dac50fSopenharmony_ci 109e0dac50fSopenharmony_civoid RootScene::UpdateViewportConfig(const Rect& rect, WindowSizeChangeReason reason) 110e0dac50fSopenharmony_ci{ 111e0dac50fSopenharmony_ci if (uiContent_ == nullptr) { 112e0dac50fSopenharmony_ci WLOGFE("uiContent_ is nullptr!"); 113e0dac50fSopenharmony_ci return; 114e0dac50fSopenharmony_ci } 115e0dac50fSopenharmony_ci Ace::ViewportConfig config; 116e0dac50fSopenharmony_ci config.SetSize(rect.width_, rect.height_); 117e0dac50fSopenharmony_ci config.SetPosition(rect.posX_, rect.posY_); 118e0dac50fSopenharmony_ci config.SetDensity(density_); 119e0dac50fSopenharmony_ci config.SetOrientation(orientation_); 120e0dac50fSopenharmony_ci uiContent_->UpdateViewportConfig(config, reason); 121e0dac50fSopenharmony_ci} 122e0dac50fSopenharmony_ci 123e0dac50fSopenharmony_civoid RootScene::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 124e0dac50fSopenharmony_ci{ 125e0dac50fSopenharmony_ci if (uiContent_) { 126e0dac50fSopenharmony_ci WLOGFD("in"); 127e0dac50fSopenharmony_ci uiContent_->UpdateConfiguration(configuration); 128e0dac50fSopenharmony_ci if (configuration == nullptr) { 129e0dac50fSopenharmony_ci return; 130e0dac50fSopenharmony_ci } 131e0dac50fSopenharmony_ci std::string colorMode = configuration->GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE); 132e0dac50fSopenharmony_ci bool isDark = (colorMode == AppExecFwk::ConfigurationInner::COLOR_MODE_DARK); 133e0dac50fSopenharmony_ci bool ret = RSInterfaces::GetInstance().SetGlobalDarkColorMode(isDark); 134e0dac50fSopenharmony_ci if (ret == false) { 135e0dac50fSopenharmony_ci WLOGFE("SetGlobalDarkColorMode fail with colorMode : %{public}s", colorMode.c_str()); 136e0dac50fSopenharmony_ci } 137e0dac50fSopenharmony_ci } 138e0dac50fSopenharmony_ci} 139e0dac50fSopenharmony_ci 140e0dac50fSopenharmony_civoid RootScene::UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 141e0dac50fSopenharmony_ci{ 142e0dac50fSopenharmony_ci WLOGFD("in"); 143e0dac50fSopenharmony_ci if (staticRootScene_) { 144e0dac50fSopenharmony_ci staticRootScene_->UpdateConfiguration(configuration); 145e0dac50fSopenharmony_ci if (configurationUpdatedCallback_) { 146e0dac50fSopenharmony_ci configurationUpdatedCallback_(configuration); 147e0dac50fSopenharmony_ci } 148e0dac50fSopenharmony_ci } 149e0dac50fSopenharmony_ci} 150e0dac50fSopenharmony_ci 151e0dac50fSopenharmony_civoid RootScene::RegisterInputEventListener() 152e0dac50fSopenharmony_ci{ 153e0dac50fSopenharmony_ci auto mainEventRunner = AppExecFwk::EventRunner::GetMainEventRunner(); 154e0dac50fSopenharmony_ci if (mainEventRunner) { 155e0dac50fSopenharmony_ci WLOGFD("MainEventRunner is available"); 156e0dac50fSopenharmony_ci eventHandler_ = std::make_shared<AppExecFwk::EventHandler>(mainEventRunner); 157e0dac50fSopenharmony_ci } else { 158e0dac50fSopenharmony_ci WLOGFD("MainEventRunner is not available"); 159e0dac50fSopenharmony_ci eventHandler_ = AppExecFwk::EventHandler::Current(); 160e0dac50fSopenharmony_ci if (!eventHandler_) { 161e0dac50fSopenharmony_ci eventHandler_ = 162e0dac50fSopenharmony_ci std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::Create(INPUT_AND_VSYNC_THREAD)); 163e0dac50fSopenharmony_ci } 164e0dac50fSopenharmony_ci } 165e0dac50fSopenharmony_ci if (!(DelayedSingleton<IntentionEventManager>::GetInstance()->EnableInputEventListener( 166e0dac50fSopenharmony_ci uiContent_.get(), eventHandler_))) { 167e0dac50fSopenharmony_ci WLOGFE("EnableInputEventListener fail"); 168e0dac50fSopenharmony_ci } 169e0dac50fSopenharmony_ci InputTransferStation::GetInstance().MarkRegisterToMMI(); 170e0dac50fSopenharmony_ci} 171e0dac50fSopenharmony_ci 172e0dac50fSopenharmony_civoid RootScene::RequestVsync(const std::shared_ptr<VsyncCallback>& vsyncCallback) 173e0dac50fSopenharmony_ci{ 174e0dac50fSopenharmony_ci vsyncStation_->RequestVsync(vsyncCallback); 175e0dac50fSopenharmony_ci} 176e0dac50fSopenharmony_ci 177e0dac50fSopenharmony_ciint64_t RootScene::GetVSyncPeriod() 178e0dac50fSopenharmony_ci{ 179e0dac50fSopenharmony_ci return vsyncStation_->GetVSyncPeriod(); 180e0dac50fSopenharmony_ci} 181e0dac50fSopenharmony_ci 182e0dac50fSopenharmony_civoid RootScene::FlushFrameRate(uint32_t rate, int32_t animatorExpectedFrameRate, uint32_t rateType) 183e0dac50fSopenharmony_ci{ 184e0dac50fSopenharmony_ci vsyncStation_->FlushFrameRate(rate, animatorExpectedFrameRate, rateType); 185e0dac50fSopenharmony_ci} 186e0dac50fSopenharmony_ci 187e0dac50fSopenharmony_civoid RootScene::OnBundleUpdated(const std::string& bundleName) 188e0dac50fSopenharmony_ci{ 189e0dac50fSopenharmony_ci WLOGFD("bundle %{public}s updated", bundleName.c_str()); 190e0dac50fSopenharmony_ci if (uiContent_) { 191e0dac50fSopenharmony_ci uiContent_->UpdateResource(); 192e0dac50fSopenharmony_ci } 193e0dac50fSopenharmony_ci} 194e0dac50fSopenharmony_ci 195e0dac50fSopenharmony_civoid RootScene::SetOnConfigurationUpdatedCallback( 196e0dac50fSopenharmony_ci const std::function<void(const std::shared_ptr<AppExecFwk::Configuration>&)>& callback) 197e0dac50fSopenharmony_ci{ 198e0dac50fSopenharmony_ci configurationUpdatedCallback_ = callback; 199e0dac50fSopenharmony_ci} 200e0dac50fSopenharmony_ci 201e0dac50fSopenharmony_civoid RootScene::SetFrameLayoutFinishCallback(std::function<void()>&& callback) 202e0dac50fSopenharmony_ci{ 203e0dac50fSopenharmony_ci frameLayoutFinishCb_ = callback; 204e0dac50fSopenharmony_ci if (uiContent_) { 205e0dac50fSopenharmony_ci uiContent_->SetFrameLayoutFinishCallback(std::move(frameLayoutFinishCb_)); 206e0dac50fSopenharmony_ci } 207e0dac50fSopenharmony_ci TLOGI(WmsLogTag::WMS_LAYOUT, "end"); 208e0dac50fSopenharmony_ci} 209e0dac50fSopenharmony_ci 210e0dac50fSopenharmony_civoid RootScene::SetUiDvsyncSwitch(bool dvsyncSwitch) 211e0dac50fSopenharmony_ci{ 212e0dac50fSopenharmony_ci vsyncStation_->SetUiDvsyncSwitch(dvsyncSwitch); 213e0dac50fSopenharmony_ci} 214e0dac50fSopenharmony_ci 215e0dac50fSopenharmony_ciWMError RootScene::GetSessionRectByType(AvoidAreaType type, WSRect& rect) 216e0dac50fSopenharmony_ci{ 217e0dac50fSopenharmony_ci if (getSessionRectCallback_ == nullptr) { 218e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_IMMS, "getSessionRectCallback is nullptr"); 219e0dac50fSopenharmony_ci return WMError::WM_ERROR_NULLPTR; 220e0dac50fSopenharmony_ci } 221e0dac50fSopenharmony_ci rect = getSessionRectCallback_(type); 222e0dac50fSopenharmony_ci return WMError::WM_OK; 223e0dac50fSopenharmony_ci} 224e0dac50fSopenharmony_ci} // namespace Rosen 225e0dac50fSopenharmony_ci} // namespace OHOS 226