1/* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "window_scene.h" 17 18#include <configuration.h> 19#include "window_impl.h" 20#include "window_manager_hilog.h" 21#include "window_model.h" 22#include "window_display.h" 23 24namespace OHOS { 25namespace Rosen { 26const std::string WindowScene::MAIN_WINDOW_ID = "main window"; 27namespace { 28constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowScene"}; 29} 30WindowScene::~WindowScene() 31{ 32} 33 34WMError WindowScene::Init(DisplayId displayId, const std::shared_ptr<AbilityRuntime::Context>& context, 35 sptr<IWindowLifeCycle>& listener, sptr<WindowOption> option) 36{ 37 WLOGFD("WindowScene with window session!"); 38 displayId_ = displayId; 39 if (option == nullptr) { 40 option = new(std::nothrow) WindowOption(); 41 if (option == nullptr) { 42 WLOGFE("alloc WindowOption failed"); 43 return WMError::WM_ERROR_NULLPTR; 44 } 45 } 46 option->SetDisplayId(displayId); 47 option->SetWindowTag(WindowTag::MAIN_WINDOW); 48 49 mainWindow_ = Window::Create(GenerateMainWindowName(context), option, context); 50 if (mainWindow_ == nullptr) { 51 WLOGFE("mainWindow_ is NULL"); 52 return WMError::WM_ERROR_NULLPTR; 53 } 54 55 Previewer::PreviewerWindowModel& windowModel = Previewer::PreviewerWindow::GetInstance().GetWindowParams(); 56 Ace::ViewportConfig config; 57 config.SetSize(windowModel.originWidth, windowModel.originHeight); 58 config.SetPosition(0, 0); 59 config.SetOrientation(static_cast<int32_t>(Previewer::PreviewerWindow::TransOrientation(windowModel.orientation))); 60 config.SetDensity(windowModel.density); 61 mainWindow_->SetViewportConfig(config); 62 63 Previewer::PreviewerWindow::GetInstance().SetWindowObject(mainWindow_.GetRefPtr()); 64 mainWindow_->RegisterLifeCycleListener(listener); 65 66 Previewer::PreviewerDisplay::GetInstance().RegisterStatusChangedCallback( 67 [this](FoldStatus status) { 68 WLOGFI("FoldStatus changed to %{public}d", status); 69 if (mainWindow_ == nullptr) { 70 WLOGFE("mainWindow_ is NULL"); 71 return WMError::WM_ERROR_NULLPTR; 72 } 73 Previewer::PreviewerDisplay::GetInstance().SetFoldStatus(status); 74 return WMError::WM_OK; 75 } 76 ); 77 78 return WMError::WM_OK; 79} 80 81std::string WindowScene::GenerateMainWindowName(const std::shared_ptr<AbilityRuntime::Context>& context) const 82{ 83 if (context == nullptr) { 84 return MAIN_WINDOW_ID + std::to_string(count++); 85 } else { 86 auto options = context->GetOptions(); 87 std::string windowName = options.bundleName + std::to_string(count++); 88 std::size_t pos = windowName.find_last_of('.'); 89 return (pos == std::string::npos) ? windowName : windowName.substr(pos + 1); // skip '.' 90 } 91} 92 93sptr<Window> WindowScene::CreateWindow(const std::string& windowName, sptr<WindowOption>& option) const 94{ 95 return nullptr; 96} 97 98const sptr<Window>& WindowScene::GetMainWindow() const 99{ 100 return mainWindow_; 101} 102 103std::vector<sptr<Window>> WindowScene::GetSubWindow() 104{ 105 return std::vector<sptr<Window>>(); 106} 107 108WMError WindowScene::GoDestroy() 109{ 110 if (mainWindow_ == nullptr) { 111 return WMError::WM_ERROR_NULLPTR; 112 } 113 114 WMError ret = mainWindow_->Destroy(); 115 if (ret != WMError::WM_OK) { 116 WLOGFE("WindowScene go destroy failed name: %{public}s", mainWindow_->GetWindowName().c_str()); 117 return ret; 118 } 119 mainWindow_ = nullptr; 120 return WMError::WM_OK; 121} 122 123void WindowScene::UpdateConfiguration(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 124{ 125 if (mainWindow_ == nullptr) { 126 WLOGFE("Update configuration failed, because main window is null"); 127 return; 128 } 129 WLOGFI("notify mainWindow winId:%{public}u", mainWindow_->GetWindowId()); 130 mainWindow_->UpdateConfiguration(configuration); 131} 132} // namespace Rosen 133} // namespace OHOS 134