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