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}