1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 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 <iostream>
17e0dac50fSopenharmony_ci#include <refbase.h>
18e0dac50fSopenharmony_ci
19e0dac50fSopenharmony_ci#include "window.h"
20e0dac50fSopenharmony_ci#include "wm_common.h"
21e0dac50fSopenharmony_ci#include "window_option.h"
22e0dac50fSopenharmony_ci#include "window_manager.h"
23e0dac50fSopenharmony_ci#include "common_test_utils.h"
24e0dac50fSopenharmony_ci#include "future.h"
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_cinamespace OHOS {
27e0dac50fSopenharmony_cinamespace Rosen {
28e0dac50fSopenharmony_ciclass SystemSubWindowFuture : public IVisibilityChangedListener {
29e0dac50fSopenharmony_ciusing VisibleInfos = std::vector<sptr<WindowVisibilityInfo>>;
30e0dac50fSopenharmony_cipublic:
31e0dac50fSopenharmony_ci    void OnWindowVisibilityChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfo) override
32e0dac50fSopenharmony_ci    {
33e0dac50fSopenharmony_ci        future_.SetValue(1);
34e0dac50fSopenharmony_ci    };
35e0dac50fSopenharmony_ci    RunnableFuture<int32_t> future_;
36e0dac50fSopenharmony_ci    static constexpr long WAIT_TIME = 20000;
37e0dac50fSopenharmony_ci};
38e0dac50fSopenharmony_ci}
39e0dac50fSopenharmony_ci}
40e0dac50fSopenharmony_ci
41e0dac50fSopenharmony_ciusing namespace OHOS;
42e0dac50fSopenharmony_ciusing namespace OHOS::Rosen;
43e0dac50fSopenharmony_ci
44e0dac50fSopenharmony_civoid OutputWindowInfos(const std::vector<sptr<AccessibilityWindowInfo>>& infos)
45e0dac50fSopenharmony_ci{
46e0dac50fSopenharmony_ci    std::cout << "window tree infos length :" << infos.size() << std::endl;
47e0dac50fSopenharmony_ci    std::cout << "windowId -- windowType -- displayId" << std::endl;
48e0dac50fSopenharmony_ci    for (auto info: infos) {
49e0dac50fSopenharmony_ci        std::cout << "  " << info->wid_;
50e0dac50fSopenharmony_ci        std::cout << " -- " << static_cast<int32_t>(info->type_);
51e0dac50fSopenharmony_ci        std::cout << " -- " << std::to_string(info->displayId_);
52e0dac50fSopenharmony_ci        std::cout << std::endl;
53e0dac50fSopenharmony_ci    }
54e0dac50fSopenharmony_ci}
55e0dac50fSopenharmony_ci
56e0dac50fSopenharmony_ciint main(int argc, char* argv[])
57e0dac50fSopenharmony_ci{
58e0dac50fSopenharmony_ci    std::cout << "===========================Start===========================" << std::endl;
59e0dac50fSopenharmony_ci    std::cout << "Wait 20s, The Windows will close itself" << std::endl;
60e0dac50fSopenharmony_ci
61e0dac50fSopenharmony_ci    std::vector<sptr<AccessibilityWindowInfo>> infos;
62e0dac50fSopenharmony_ci    WindowManager::GetInstance().GetAccessibilityWindowInfo(infos);
63e0dac50fSopenharmony_ci    std::cout << "before add window " << std::endl;
64e0dac50fSopenharmony_ci    OutputWindowInfos(infos);
65e0dac50fSopenharmony_ci
66e0dac50fSopenharmony_ci    CommonTestUtils::GuaranteeFloatWindowPermission("demo_system_sub_window");
67e0dac50fSopenharmony_ci    Rect baseWindowRect = { 150, 150, 400, 600 };
68e0dac50fSopenharmony_ci    sptr<WindowOption> baseOp = new WindowOption();
69e0dac50fSopenharmony_ci    baseOp->SetWindowType(WindowType::WINDOW_TYPE_FLOAT);
70e0dac50fSopenharmony_ci    baseOp->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
71e0dac50fSopenharmony_ci    baseOp->SetWindowRect(baseWindowRect);
72e0dac50fSopenharmony_ci
73e0dac50fSopenharmony_ci    sptr<Window> window = Window::Create("Demo_SSW_BaseWindow", baseOp, nullptr);
74e0dac50fSopenharmony_ci    window->Show();
75e0dac50fSopenharmony_ci    std::cout << "base window id = " << window->GetWindowId() << std::endl;
76e0dac50fSopenharmony_ci
77e0dac50fSopenharmony_ci    Rect subWindowRect = { 200, 200, 150, 150 };
78e0dac50fSopenharmony_ci    sptr<WindowOption> subWindowOp = new WindowOption();
79e0dac50fSopenharmony_ci    subWindowOp->SetWindowType(WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW);
80e0dac50fSopenharmony_ci    subWindowOp->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
81e0dac50fSopenharmony_ci    subWindowOp->SetWindowRect(subWindowRect);
82e0dac50fSopenharmony_ci    subWindowOp->SetParentId(window->GetWindowId());
83e0dac50fSopenharmony_ci
84e0dac50fSopenharmony_ci    sptr<Window> subWindow = Window::Create("Demo_SSW_SubWindow", subWindowOp, nullptr);
85e0dac50fSopenharmony_ci    subWindow->Show();
86e0dac50fSopenharmony_ci    std::cout << "sub window id = " << subWindow->GetWindowId() << std::endl;
87e0dac50fSopenharmony_ci
88e0dac50fSopenharmony_ci    infos.clear();
89e0dac50fSopenharmony_ci    WindowManager::GetInstance().GetAccessibilityWindowInfo(infos);
90e0dac50fSopenharmony_ci    std::cout << "after add window:" << std::endl;
91e0dac50fSopenharmony_ci    OutputWindowInfos(infos);
92e0dac50fSopenharmony_ci
93e0dac50fSopenharmony_ci    std::cout << std::endl;
94e0dac50fSopenharmony_ci    std::cout << "please check hidump to makesure the sub window node is on window tree" << std::endl;
95e0dac50fSopenharmony_ci    sptr<SystemSubWindowFuture> listener = new SystemSubWindowFuture();
96e0dac50fSopenharmony_ci    listener->future_.Reset(0);
97e0dac50fSopenharmony_ci    listener->future_.GetResult(SystemSubWindowFuture::WAIT_TIME);
98e0dac50fSopenharmony_ci
99e0dac50fSopenharmony_ci    subWindow->Hide();
100e0dac50fSopenharmony_ci    window->Hide();
101e0dac50fSopenharmony_ci
102e0dac50fSopenharmony_ci    subWindow->Destroy();
103e0dac50fSopenharmony_ci    window->Destroy();
104e0dac50fSopenharmony_ci
105e0dac50fSopenharmony_ci    infos.clear();
106e0dac50fSopenharmony_ci    WindowManager::GetInstance().GetAccessibilityWindowInfo(infos);
107e0dac50fSopenharmony_ci    std::cout << "after destroy window:" << std::endl;
108e0dac50fSopenharmony_ci    OutputWindowInfos(infos);
109e0dac50fSopenharmony_ci
110e0dac50fSopenharmony_ci    std::cout << "============================End============================" << std::endl;
111e0dac50fSopenharmony_ci    return 0;
112e0dac50fSopenharmony_ci}