1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022-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 "window_scene.h"
17e0dac50fSopenharmony_ci
18e0dac50fSopenharmony_ci#include <configuration.h>
19e0dac50fSopenharmony_ci#include "window_impl.h"
20e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
21e0dac50fSopenharmony_ci#include "window_model.h"
22e0dac50fSopenharmony_ci#include "window_display.h"
23e0dac50fSopenharmony_ci
24e0dac50fSopenharmony_cinamespace OHOS {
25e0dac50fSopenharmony_cinamespace Rosen {
26e0dac50fSopenharmony_ciconst std::string WindowScene::MAIN_WINDOW_ID = "main window";
27e0dac50fSopenharmony_cinamespace {
28e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowScene"};
29e0dac50fSopenharmony_ci}
30e0dac50fSopenharmony_ciWindowScene::~WindowScene()
31e0dac50fSopenharmony_ci{
32e0dac50fSopenharmony_ci}
33e0dac50fSopenharmony_ci
34e0dac50fSopenharmony_ciWMError WindowScene::Init(DisplayId displayId, const std::shared_ptr<AbilityRuntime::Context>& context,
35e0dac50fSopenharmony_ci    sptr<IWindowLifeCycle>& listener, sptr<WindowOption> option)
36e0dac50fSopenharmony_ci{
37e0dac50fSopenharmony_ci    WLOGFD("WindowScene with window session!");
38e0dac50fSopenharmony_ci    displayId_ = displayId;
39e0dac50fSopenharmony_ci    if (option == nullptr) {
40e0dac50fSopenharmony_ci        option = new(std::nothrow) WindowOption();
41e0dac50fSopenharmony_ci        if (option == nullptr) {
42e0dac50fSopenharmony_ci            WLOGFE("alloc WindowOption failed");
43e0dac50fSopenharmony_ci            return WMError::WM_ERROR_NULLPTR;
44e0dac50fSopenharmony_ci        }
45e0dac50fSopenharmony_ci    }
46e0dac50fSopenharmony_ci    option->SetDisplayId(displayId);
47e0dac50fSopenharmony_ci    option->SetWindowTag(WindowTag::MAIN_WINDOW);
48e0dac50fSopenharmony_ci
49e0dac50fSopenharmony_ci    mainWindow_ = Window::Create(GenerateMainWindowName(context), option, context);
50e0dac50fSopenharmony_ci    if (mainWindow_ == nullptr) {
51e0dac50fSopenharmony_ci        WLOGFE("mainWindow_ is NULL");
52e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
53e0dac50fSopenharmony_ci    }
54e0dac50fSopenharmony_ci
55e0dac50fSopenharmony_ci    Previewer::PreviewerWindowModel& windowModel =  Previewer::PreviewerWindow::GetInstance().GetWindowParams();
56e0dac50fSopenharmony_ci    Ace::ViewportConfig config;
57e0dac50fSopenharmony_ci    config.SetSize(windowModel.originWidth, windowModel.originHeight);
58e0dac50fSopenharmony_ci    config.SetPosition(0, 0);
59e0dac50fSopenharmony_ci    config.SetOrientation(static_cast<int32_t>(Previewer::PreviewerWindow::TransOrientation(windowModel.orientation)));
60e0dac50fSopenharmony_ci    config.SetDensity(windowModel.density);
61e0dac50fSopenharmony_ci    mainWindow_->SetViewportConfig(config);
62e0dac50fSopenharmony_ci
63e0dac50fSopenharmony_ci    Previewer::PreviewerWindow::GetInstance().SetWindowObject(mainWindow_.GetRefPtr());
64e0dac50fSopenharmony_ci    mainWindow_->RegisterLifeCycleListener(listener);
65e0dac50fSopenharmony_ci
66e0dac50fSopenharmony_ci    Previewer::PreviewerDisplay::GetInstance().RegisterStatusChangedCallback(
67e0dac50fSopenharmony_ci        [this](FoldStatus status) {
68e0dac50fSopenharmony_ci            WLOGFI("FoldStatus changed to %{public}d", status);
69e0dac50fSopenharmony_ci            if (mainWindow_ == nullptr) {
70e0dac50fSopenharmony_ci                WLOGFE("mainWindow_ is NULL");
71e0dac50fSopenharmony_ci                return WMError::WM_ERROR_NULLPTR;
72e0dac50fSopenharmony_ci            }
73e0dac50fSopenharmony_ci            Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(status);
74e0dac50fSopenharmony_ci            return WMError::WM_OK;
75e0dac50fSopenharmony_ci        }
76e0dac50fSopenharmony_ci    );
77e0dac50fSopenharmony_ci
78e0dac50fSopenharmony_ci    return WMError::WM_OK;
79e0dac50fSopenharmony_ci}
80e0dac50fSopenharmony_ci
81e0dac50fSopenharmony_cistd::string WindowScene::GenerateMainWindowName(const std::shared_ptr<AbilityRuntime::Context>& context) const
82e0dac50fSopenharmony_ci{
83e0dac50fSopenharmony_ci    if (context == nullptr) {
84e0dac50fSopenharmony_ci        return MAIN_WINDOW_ID + std::to_string(count++);
85e0dac50fSopenharmony_ci    } else {
86e0dac50fSopenharmony_ci        auto options = context->GetOptions();
87e0dac50fSopenharmony_ci        std::string windowName = options.bundleName + std::to_string(count++);
88e0dac50fSopenharmony_ci        std::size_t pos = windowName.find_last_of('.');
89e0dac50fSopenharmony_ci        return (pos == std::string::npos) ? windowName : windowName.substr(pos + 1); // skip '.'
90e0dac50fSopenharmony_ci    }
91e0dac50fSopenharmony_ci}
92e0dac50fSopenharmony_ci
93e0dac50fSopenharmony_cisptr<Window> WindowScene::CreateWindow(const std::string& windowName, sptr<WindowOption>& option) const
94e0dac50fSopenharmony_ci{
95e0dac50fSopenharmony_ci    return nullptr;
96e0dac50fSopenharmony_ci}
97e0dac50fSopenharmony_ci
98e0dac50fSopenharmony_ciconst sptr<Window>& WindowScene::GetMainWindow() const
99e0dac50fSopenharmony_ci{
100e0dac50fSopenharmony_ci    return mainWindow_;
101e0dac50fSopenharmony_ci}
102e0dac50fSopenharmony_ci
103e0dac50fSopenharmony_cistd::vector<sptr<Window>> WindowScene::GetSubWindow()
104e0dac50fSopenharmony_ci{
105e0dac50fSopenharmony_ci    return std::vector<sptr<Window>>();
106e0dac50fSopenharmony_ci}
107e0dac50fSopenharmony_ci
108e0dac50fSopenharmony_ciWMError WindowScene::GoDestroy()
109e0dac50fSopenharmony_ci{
110e0dac50fSopenharmony_ci    if (mainWindow_ == nullptr) {
111e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
112e0dac50fSopenharmony_ci    }
113e0dac50fSopenharmony_ci
114e0dac50fSopenharmony_ci    WMError ret = mainWindow_->Destroy();
115e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
116e0dac50fSopenharmony_ci        WLOGFE("WindowScene go destroy failed name: %{public}s", mainWindow_->GetWindowName().c_str());
117e0dac50fSopenharmony_ci        return ret;
118e0dac50fSopenharmony_ci    }
119e0dac50fSopenharmony_ci    mainWindow_ = nullptr;
120e0dac50fSopenharmony_ci    return WMError::WM_OK;
121e0dac50fSopenharmony_ci}
122e0dac50fSopenharmony_ci
123e0dac50fSopenharmony_civoid WindowScene::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration)
124e0dac50fSopenharmony_ci{
125e0dac50fSopenharmony_ci    if (mainWindow_ == nullptr) {
126e0dac50fSopenharmony_ci        WLOGFE("Update configuration failed, because main window is null");
127e0dac50fSopenharmony_ci        return;
128e0dac50fSopenharmony_ci    }
129e0dac50fSopenharmony_ci    WLOGFI("notify mainWindow winId:%{public}u", mainWindow_->GetWindowId());
130e0dac50fSopenharmony_ci    mainWindow_->UpdateConfiguration(configuration);
131e0dac50fSopenharmony_ci}
132e0dac50fSopenharmony_ci} // namespace Rosen
133e0dac50fSopenharmony_ci} // namespace OHOS
134