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