1e0dac50fSopenharmony_ci/* 2e0dac50fSopenharmony_ci * Copyright (c) 2021 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.h" 17e0dac50fSopenharmony_ci 18e0dac50fSopenharmony_ci#include "root_scene.h" 19e0dac50fSopenharmony_ci#include "scene_board_judgement.h" 20e0dac50fSopenharmony_ci#include "session/host/include/zidl/session_interface.h" 21e0dac50fSopenharmony_ci#include "window_helper.h" 22e0dac50fSopenharmony_ci#include "window_impl.h" 23e0dac50fSopenharmony_ci#include "window_session_impl.h" 24e0dac50fSopenharmony_ci#include "window_scene_session_impl.h" 25e0dac50fSopenharmony_ci#include "window_extension_session_impl.h" 26e0dac50fSopenharmony_ci#include "window_manager_hilog.h" 27e0dac50fSopenharmony_ci#include "wm_common.h" 28e0dac50fSopenharmony_ci 29e0dac50fSopenharmony_cinamespace OHOS { 30e0dac50fSopenharmony_cinamespace Rosen { 31e0dac50fSopenharmony_cinamespace { 32e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "Window"}; 33e0dac50fSopenharmony_ci} 34e0dac50fSopenharmony_ci 35e0dac50fSopenharmony_cistatic sptr<Window> CreateWindowWithSession(sptr<WindowOption>& option, 36e0dac50fSopenharmony_ci const std::shared_ptr<OHOS::AbilityRuntime::Context>& context, WMError& errCode, 37e0dac50fSopenharmony_ci sptr<ISession> iSession = nullptr, const std::string& identityToken = "") 38e0dac50fSopenharmony_ci{ 39e0dac50fSopenharmony_ci WLOGFD("in"); 40e0dac50fSopenharmony_ci sptr<WindowSessionImpl> windowSessionImpl = nullptr; 41e0dac50fSopenharmony_ci auto sessionType = option->GetWindowSessionType(); 42e0dac50fSopenharmony_ci if (sessionType == WindowSessionType::SCENE_SESSION) { 43e0dac50fSopenharmony_ci windowSessionImpl = sptr<WindowSceneSessionImpl>::MakeSptr(option); 44e0dac50fSopenharmony_ci } else if (sessionType == WindowSessionType::EXTENSION_SESSION) { 45e0dac50fSopenharmony_ci option->SetWindowType(WindowType::WINDOW_TYPE_UI_EXTENSION); 46e0dac50fSopenharmony_ci windowSessionImpl = sptr<WindowExtensionSessionImpl>::MakeSptr(option); 47e0dac50fSopenharmony_ci } 48e0dac50fSopenharmony_ci if (windowSessionImpl == nullptr) { 49e0dac50fSopenharmony_ci WLOGFE("malloc windowSessionImpl failed"); 50e0dac50fSopenharmony_ci return nullptr; 51e0dac50fSopenharmony_ci } 52e0dac50fSopenharmony_ci 53e0dac50fSopenharmony_ci windowSessionImpl->SetWindowType(option->GetWindowType()); 54e0dac50fSopenharmony_ci WMError error = windowSessionImpl->Create(context, iSession, identityToken); 55e0dac50fSopenharmony_ci if (error != WMError::WM_OK) { 56e0dac50fSopenharmony_ci errCode = error; 57e0dac50fSopenharmony_ci WLOGFE("error: %{public}u", static_cast<uint32_t>(errCode)); 58e0dac50fSopenharmony_ci return nullptr; 59e0dac50fSopenharmony_ci } 60e0dac50fSopenharmony_ci return windowSessionImpl; 61e0dac50fSopenharmony_ci} 62e0dac50fSopenharmony_ci 63e0dac50fSopenharmony_cisptr<Window> Window::Create(const std::string& windowName, sptr<WindowOption>& option, 64e0dac50fSopenharmony_ci const std::shared_ptr<OHOS::AbilityRuntime::Context>& context, WMError& errCode) 65e0dac50fSopenharmony_ci{ 66e0dac50fSopenharmony_ci if (windowName.empty()) { 67e0dac50fSopenharmony_ci WLOGFE("window name is empty"); 68e0dac50fSopenharmony_ci return nullptr; 69e0dac50fSopenharmony_ci } 70e0dac50fSopenharmony_ci if (option == nullptr) { 71e0dac50fSopenharmony_ci option = sptr<WindowOption>::MakeSptr(); 72e0dac50fSopenharmony_ci } 73e0dac50fSopenharmony_ci uint32_t version = 10; 74e0dac50fSopenharmony_ci if (context != nullptr && context->GetApplicationInfo() != nullptr) { 75e0dac50fSopenharmony_ci version = context->GetApplicationInfo()->apiCompatibleVersion; 76e0dac50fSopenharmony_ci } 77e0dac50fSopenharmony_ci // 10 ArkUI new framework support after API10 78e0dac50fSopenharmony_ci if (version < 10) { 79e0dac50fSopenharmony_ci option->AddWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 80e0dac50fSopenharmony_ci } 81e0dac50fSopenharmony_ci WindowType type = option->GetWindowType(); 82e0dac50fSopenharmony_ci if (!(WindowHelper::IsAppWindow(type) || WindowHelper::IsSystemWindow(type))) { 83e0dac50fSopenharmony_ci WLOGFE("window type is invalid %{public}d", type); 84e0dac50fSopenharmony_ci return nullptr; 85e0dac50fSopenharmony_ci } 86e0dac50fSopenharmony_ci option->SetWindowName(windowName); 87e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 88e0dac50fSopenharmony_ci return CreateWindowWithSession(option, context, errCode); 89e0dac50fSopenharmony_ci } 90e0dac50fSopenharmony_ci if (option->GetOnlySupportSceneBoard()) { 91e0dac50fSopenharmony_ci errCode = WMError::WM_ERROR_DEVICE_NOT_SUPPORT; 92e0dac50fSopenharmony_ci return nullptr; 93e0dac50fSopenharmony_ci } 94e0dac50fSopenharmony_ci sptr<WindowImpl> windowImpl = sptr<WindowImpl>::MakeSptr(option); 95e0dac50fSopenharmony_ci if (windowImpl == nullptr) { 96e0dac50fSopenharmony_ci WLOGFE("malloc windowImpl failed"); 97e0dac50fSopenharmony_ci return nullptr; 98e0dac50fSopenharmony_ci } 99e0dac50fSopenharmony_ci WMError error = windowImpl->Create(option->GetParentId(), context); 100e0dac50fSopenharmony_ci if (error != WMError::WM_OK) { 101e0dac50fSopenharmony_ci errCode = error; 102e0dac50fSopenharmony_ci return nullptr; 103e0dac50fSopenharmony_ci } 104e0dac50fSopenharmony_ci return windowImpl; 105e0dac50fSopenharmony_ci} 106e0dac50fSopenharmony_ci 107e0dac50fSopenharmony_cisptr<Window> Window::Create(sptr<WindowOption>& option, const std::shared_ptr<OHOS::AbilityRuntime::Context>& context, 108e0dac50fSopenharmony_ci const sptr<IRemoteObject>& iSession, WMError& errCode, const std::string& identityToken) 109e0dac50fSopenharmony_ci{ 110e0dac50fSopenharmony_ci // create from ability mgr service 111e0dac50fSopenharmony_ci if (!iSession || !option) { 112e0dac50fSopenharmony_ci WLOGFE("host window session is nullptr: %{public}u or option is null: %{public}u", 113e0dac50fSopenharmony_ci iSession == nullptr, option == nullptr); 114e0dac50fSopenharmony_ci return nullptr; 115e0dac50fSopenharmony_ci } 116e0dac50fSopenharmony_ci if (option->GetWindowName().empty()) { 117e0dac50fSopenharmony_ci WLOGFE("window name in option is empty"); 118e0dac50fSopenharmony_ci return nullptr; 119e0dac50fSopenharmony_ci } 120e0dac50fSopenharmony_ci uint32_t version = 10; 121e0dac50fSopenharmony_ci if ((context != nullptr) && (context->GetApplicationInfo() != nullptr)) { 122e0dac50fSopenharmony_ci version = context->GetApplicationInfo()->apiCompatibleVersion; 123e0dac50fSopenharmony_ci } 124e0dac50fSopenharmony_ci // 10 ArkUI new framework support after API10 125e0dac50fSopenharmony_ci if (version < 10) { 126e0dac50fSopenharmony_ci option->AddWindowFlag(WindowFlag::WINDOW_FLAG_NEED_AVOID); 127e0dac50fSopenharmony_ci } 128e0dac50fSopenharmony_ci WindowType type = option->GetWindowType(); 129e0dac50fSopenharmony_ci if (!(WindowHelper::IsAppWindow(type) || WindowHelper::IsUIExtensionWindow(type) || 130e0dac50fSopenharmony_ci WindowHelper::IsAppComponentWindow(type))) { 131e0dac50fSopenharmony_ci WLOGFE("window type is invalid %{public}d", type); 132e0dac50fSopenharmony_ci return nullptr; 133e0dac50fSopenharmony_ci } 134e0dac50fSopenharmony_ci return CreateWindowWithSession(option, context, errCode, 135e0dac50fSopenharmony_ci iface_cast<Rosen::ISession>(iSession), identityToken); 136e0dac50fSopenharmony_ci} 137e0dac50fSopenharmony_ci 138e0dac50fSopenharmony_cisptr<Window> Window::CreatePiP(sptr<WindowOption>& option, const PiPTemplateInfo& pipTemplateInfo, 139e0dac50fSopenharmony_ci const std::shared_ptr<OHOS::AbilityRuntime::Context>& context, WMError& errCode) 140e0dac50fSopenharmony_ci{ 141e0dac50fSopenharmony_ci if (!SceneBoardJudgement::IsSceneBoardEnabled()) { 142e0dac50fSopenharmony_ci return nullptr; 143e0dac50fSopenharmony_ci } 144e0dac50fSopenharmony_ci if (!option) { 145e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "option is null."); 146e0dac50fSopenharmony_ci return nullptr; 147e0dac50fSopenharmony_ci } 148e0dac50fSopenharmony_ci if (option->GetWindowName().empty()) { 149e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "the window name of option is empty."); 150e0dac50fSopenharmony_ci return nullptr; 151e0dac50fSopenharmony_ci } 152e0dac50fSopenharmony_ci if (!WindowHelper::IsPipWindow(option->GetWindowType())) { 153e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "window type is not pip window."); 154e0dac50fSopenharmony_ci return nullptr; 155e0dac50fSopenharmony_ci } 156e0dac50fSopenharmony_ci sptr<WindowSessionImpl> windowSessionImpl = sptr<WindowSceneSessionImpl>::MakeSptr(option); 157e0dac50fSopenharmony_ci if (windowSessionImpl == nullptr) { 158e0dac50fSopenharmony_ci TLOGE(WmsLogTag::WMS_PIP, "malloc windowSessionImpl failed."); 159e0dac50fSopenharmony_ci return nullptr; 160e0dac50fSopenharmony_ci } 161e0dac50fSopenharmony_ci windowSessionImpl->GetProperty()->SetPiPTemplateInfo(pipTemplateInfo); 162e0dac50fSopenharmony_ci WMError error = windowSessionImpl->Create(context, nullptr); 163e0dac50fSopenharmony_ci if (error != WMError::WM_OK) { 164e0dac50fSopenharmony_ci errCode = error; 165e0dac50fSopenharmony_ci TLOGW(WmsLogTag::WMS_PIP, "Create pip window, error: %{public}u", static_cast<uint32_t>(errCode)); 166e0dac50fSopenharmony_ci return nullptr; 167e0dac50fSopenharmony_ci } 168e0dac50fSopenharmony_ci return windowSessionImpl; 169e0dac50fSopenharmony_ci} 170e0dac50fSopenharmony_ci 171e0dac50fSopenharmony_cisptr<Window> Window::Find(const std::string& windowName) 172e0dac50fSopenharmony_ci{ 173e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 174e0dac50fSopenharmony_ci return WindowSessionImpl::Find(windowName); 175e0dac50fSopenharmony_ci } else { 176e0dac50fSopenharmony_ci return WindowImpl::Find(windowName); 177e0dac50fSopenharmony_ci } 178e0dac50fSopenharmony_ci} 179e0dac50fSopenharmony_ci 180e0dac50fSopenharmony_ciuint32_t Window::GetParentMainWindowId(uint32_t windowId) 181e0dac50fSopenharmony_ci{ 182e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 183e0dac50fSopenharmony_ci return static_cast<uint32_t>(WindowSceneSessionImpl::GetParentMainWindowId(windowId)); 184e0dac50fSopenharmony_ci } else { 185e0dac50fSopenharmony_ci return INVALID_SESSION_ID; 186e0dac50fSopenharmony_ci } 187e0dac50fSopenharmony_ci} 188e0dac50fSopenharmony_ci 189e0dac50fSopenharmony_cisptr<Window> Window::GetTopWindowWithContext(const std::shared_ptr<AbilityRuntime::Context>& context) 190e0dac50fSopenharmony_ci{ 191e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 192e0dac50fSopenharmony_ci return WindowSceneSessionImpl::GetTopWindowWithContext(context); 193e0dac50fSopenharmony_ci } else { 194e0dac50fSopenharmony_ci return WindowImpl::GetTopWindowWithContext(context); 195e0dac50fSopenharmony_ci } 196e0dac50fSopenharmony_ci} 197e0dac50fSopenharmony_ci 198e0dac50fSopenharmony_cisptr<Window> Window::GetTopWindowWithId(uint32_t mainWinId) 199e0dac50fSopenharmony_ci{ 200e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 201e0dac50fSopenharmony_ci return WindowSceneSessionImpl::GetTopWindowWithId(mainWinId); 202e0dac50fSopenharmony_ci } else { 203e0dac50fSopenharmony_ci return WindowImpl::GetTopWindowWithId(mainWinId); 204e0dac50fSopenharmony_ci } 205e0dac50fSopenharmony_ci} 206e0dac50fSopenharmony_ci 207e0dac50fSopenharmony_cisptr<Window> Window::GetWindowWithId(uint32_t windId) 208e0dac50fSopenharmony_ci{ 209e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 210e0dac50fSopenharmony_ci return WindowSceneSessionImpl::GetWindowWithId(windId); 211e0dac50fSopenharmony_ci } else { 212e0dac50fSopenharmony_ci return WindowImpl::GetWindowWithId(windId); 213e0dac50fSopenharmony_ci } 214e0dac50fSopenharmony_ci} 215e0dac50fSopenharmony_ci 216e0dac50fSopenharmony_cisptr<Window> Window::GetMainWindowWithContext(const std::shared_ptr<AbilityRuntime::Context>& context) 217e0dac50fSopenharmony_ci{ 218e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 219e0dac50fSopenharmony_ci return WindowSceneSessionImpl::GetMainWindowWithContext(context); 220e0dac50fSopenharmony_ci } else { 221e0dac50fSopenharmony_ci return nullptr; 222e0dac50fSopenharmony_ci } 223e0dac50fSopenharmony_ci} 224e0dac50fSopenharmony_ci 225e0dac50fSopenharmony_cistd::vector<sptr<Window>> Window::GetSubWindow(uint32_t parentId) 226e0dac50fSopenharmony_ci{ 227e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 228e0dac50fSopenharmony_ci return WindowSessionImpl::GetSubWindow(parentId); 229e0dac50fSopenharmony_ci } else { 230e0dac50fSopenharmony_ci return WindowImpl::GetSubWindow(parentId); 231e0dac50fSopenharmony_ci } 232e0dac50fSopenharmony_ci} 233e0dac50fSopenharmony_ci 234e0dac50fSopenharmony_civoid Window::UpdateConfigurationForAll(const std::shared_ptr<AppExecFwk::Configuration>& configuration) 235e0dac50fSopenharmony_ci{ 236e0dac50fSopenharmony_ci if (SceneBoardJudgement::IsSceneBoardEnabled()) { 237e0dac50fSopenharmony_ci WindowSceneSessionImpl::UpdateConfigurationForAll(configuration); 238e0dac50fSopenharmony_ci RootScene::UpdateConfigurationForAll(configuration); 239e0dac50fSopenharmony_ci WindowExtensionSessionImpl::UpdateConfigurationForAll(configuration); 240e0dac50fSopenharmony_ci } else { 241e0dac50fSopenharmony_ci WindowImpl::UpdateConfigurationForAll(configuration); 242e0dac50fSopenharmony_ci } 243e0dac50fSopenharmony_ci} 244e0dac50fSopenharmony_ci} // namespace Rosen 245e0dac50fSopenharmony_ci} // namespace OHOS 246