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