• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 // gtest
17 #include <gtest/gtest.h>
18 #include "scene_board_judgement.h"
19 #include "window_manager.h"
20 #include "window_test_utils.h"
21 #include "wm_common.h"
22 using namespace testing;
23 using namespace testing::ext;
24 
25 namespace OHOS {
26 namespace Rosen {
27 namespace {
28 constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowFocusTest" };
29 }
30 
31 using Utils = WindowTestUtils;
32 const int WAIT_ASYNC_US = 100000; // 100000us
33 
34 class TestFocusChangedListener : public IFocusChangedListener {
35 public:
36     uint32_t focusedWindow_ = INVALID_WINDOW_ID;
37     uint32_t unfocusedWindow_ = INVALID_WINDOW_ID;
38     void OnFocused(const sptr<FocusChangeInfo>& focusChangeInfo) override;
39     void OnUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo) override;
40 };
41 
42 class WindowFocusTest : public testing::Test {
43 public:
44     static void SetUpTestCase();
45     static void TearDownTestCase();
46     virtual void SetUp() override;
47     virtual void TearDown() override;
48     static sptr<TestFocusChangedListener> testFocusChangedListener_;
49     Utils::TestWindowInfo fullScreenAppInfo_;
50     Utils::TestWindowInfo floatAppInfo_;
51     Utils::TestWindowInfo subAppInfo_;
52 };
53 
54 sptr<TestFocusChangedListener> WindowFocusTest::testFocusChangedListener_ = new TestFocusChangedListener();
55 
OnFocused(const sptr<FocusChangeInfo> & focusChangeInfo)56 void TestFocusChangedListener::OnFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
57 {
58     WLOGI("TestFocusChangedListener Focused ID: %{public}u", focusChangeInfo->windowId_);
59     focusedWindow_ = focusChangeInfo->windowId_;
60 }
61 
OnUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)62 void TestFocusChangedListener::OnUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
63 {
64     WLOGI("TestFocusChangedListener Unfocused ID: %{public}u", focusChangeInfo->windowId_);
65     unfocusedWindow_ = focusChangeInfo->windowId_;
66 }
67 
SetUpTestCase()68 void WindowFocusTest::SetUpTestCase()
69 {
70     auto display = DisplayManager::GetInstance().GetDisplayById(0);
71     ASSERT_TRUE((display != nullptr));
72     WLOGI("GetDefaultDisplay: id %{public}" PRIu64 ", w %{public}d, h %{public}d, fps %{public}u",
73           display->GetId(),
74           display->GetWidth(),
75           display->GetHeight(),
76           display->GetRefreshRate());
77     Rect displayRect = { 0, 0, display->GetWidth(), display->GetHeight() };
78     Utils::InitByDisplayRect(displayRect);
79 }
80 
TearDownTestCase()81 void WindowFocusTest::TearDownTestCase() {}
82 
SetUp()83 void WindowFocusTest::SetUp()
84 {
85     fullScreenAppInfo_ = {
86         .name = "FullWindow",
87         .rect = Utils::customAppRect_,
88         .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
89         .mode = WindowMode::WINDOW_MODE_FULLSCREEN,
90         .needAvoid = false,
91         .parentLimit = false,
92         .showWhenLocked = true,
93         .parentId = INVALID_WINDOW_ID,
94     };
95     floatAppInfo_ = {
96         .name = "ParentWindow",
97         .rect = Utils::customAppRect_,
98         .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
99         .mode = WindowMode::WINDOW_MODE_FLOATING,
100         .needAvoid = false,
101         .parentLimit = false,
102         .showWhenLocked = true,
103         .parentId = INVALID_WINDOW_ID,
104     };
105     subAppInfo_ = {
106         .name = "SubWindow",
107         .rect = Utils::customAppRect_,
108         .type = WindowType::WINDOW_TYPE_APP_SUB_WINDOW,
109         .mode = WindowMode::WINDOW_MODE_FLOATING,
110         .needAvoid = false,
111         .parentLimit = false,
112         .showWhenLocked = false,
113         .parentId = INVALID_WINDOW_ID,
114     };
115     WindowManager::GetInstance().RegisterFocusChangedListener(testFocusChangedListener_);
116 }
117 
TearDown()118 void WindowFocusTest::TearDown()
119 {
120     WindowManager::GetInstance().UnregisterFocusChangedListener(testFocusChangedListener_);
121 }
122 
123 namespace {
124 /**
125  * @tc.name: FocusChangedTest01
126  * @tc.desc: add main window and sub window and show it to test focus
127  * @tc.type: FUNC
128  */
129 HWTEST_F(WindowFocusTest, FocusChangedTest01, TestSize.Level1)
130 {
131     fullScreenAppInfo_.name = "FocusChangedTest01_1";
132     fullScreenAppInfo_.focusable_ = false;
133     const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
134     ASSERT_NE(nullptr, window1);
135 
136     floatAppInfo_.name = "FocusChangedTest01_2";
137     floatAppInfo_.rect = { 10, 200, 300, 400 };
138     const sptr<Window>& window2 = Utils::CreateTestWindow(floatAppInfo_);
139     ASSERT_NE(nullptr, window2);
140 
141     floatAppInfo_.name = "FocusChangedTest01_3";
142     floatAppInfo_.rect = { 250, 150, 300, 500 };
143     const sptr<Window>& window3 = Utils::CreateTestWindow(floatAppInfo_);
144     ASSERT_NE(nullptr, window3);
145 
146     subAppInfo_.name = "FocusChangedTest01_4";
147     subAppInfo_.rect = { 400, 200, 100, 100 };
148     subAppInfo_.parentId = window3->GetWindowId();
149     const sptr<Window>& subWindow = Utils::CreateTestWindow(subAppInfo_);
150     ASSERT_NE(nullptr, subWindow);
151     ASSERT_EQ(WMError::WM_OK, window3->Show());
152     // Await 100ms and get callback result in listener.
153     usleep(WAIT_ASYNC_US);
154     ASSERT_EQ(window3->GetWindowId(), testFocusChangedListener_->focusedWindow_);
155 
156     ASSERT_EQ(WMError::WM_OK, window1->Show());
157     // Await 100ms and get callback result in listener.
158     usleep(WAIT_ASYNC_US);
159     ASSERT_EQ(window3->GetWindowId(), testFocusChangedListener_->focusedWindow_);
160 
161     ASSERT_EQ(WMError::WM_OK, window2->Show());
162     // Await 100ms and get callback result in listener.
163     usleep(WAIT_ASYNC_US);
164     ASSERT_EQ(window3->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
165     ASSERT_EQ(window2->GetWindowId(), testFocusChangedListener_->focusedWindow_);
166 
167     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
168     // Await 100ms and get callback result in listener.
169     usleep(WAIT_ASYNC_US);
170     ASSERT_EQ(window2->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
171     ASSERT_EQ(subWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
172 
173     window1->Destroy();
174     window2->Destroy();
175     window3->Destroy();
176     subWindow->Destroy();
177 }
178 
179 /**
180  * @tc.name: FocusChangedTest02
181  * @tc.desc: hide focused window to test focus
182  * @tc.type: FUNC
183  */
184 HWTEST_F(WindowFocusTest, FocusChangedTest02, TestSize.Level1)
185 {
186     floatAppInfo_.name = "FocusChangedTest02_1";
187     floatAppInfo_.rect = { 10, 200, 300, 400 };
188     const sptr<Window>& mainWindow = Utils::CreateTestWindow(floatAppInfo_);
189     ASSERT_NE(nullptr, mainWindow);
190     ASSERT_EQ(WMError::WM_OK, mainWindow->Show());
191 
192     subAppInfo_.name = "FocusChangedTest02_2";
193     subAppInfo_.rect = { 400, 200, 100, 100 };
194     subAppInfo_.parentId = mainWindow->GetWindowId();
195     const sptr<Window>& subWindow = Utils::CreateTestWindow(subAppInfo_);
196     ASSERT_NE(nullptr, subWindow);
197     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
198     usleep(WAIT_ASYNC_US);
199     ASSERT_EQ(subWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
200 
201     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
202     // Await 100ms and get callback result in listener.
203     usleep(WAIT_ASYNC_US);
204     ASSERT_EQ(mainWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
205 
206     mainWindow->Destroy();
207     subWindow->Destroy();
208 }
209 
210 /**
211  * @tc.name: FocusChangedTest03
212  * @tc.desc: hide focused window to test focus
213  * @tc.type: FUNC
214  */
215 HWTEST_F(WindowFocusTest, FocusChangedTest03, TestSize.Level1)
216 {
217     floatAppInfo_.name = "FocusChangedTest03_1";
218     floatAppInfo_.rect = { 10, 200, 300, 400 };
219     const sptr<Window>& mainWindow1 = Utils::CreateTestWindow(floatAppInfo_);
220     ASSERT_NE(nullptr, mainWindow1);
221     ASSERT_EQ(WMError::WM_OK, mainWindow1->Show());
222 
223     subAppInfo_.name = "FocusChangedTest03_2";
224     subAppInfo_.rect = { 400, 200, 100, 100 };
225     subAppInfo_.parentId = mainWindow1->GetWindowId();
226     const sptr<Window>& aboveSubWindow = Utils::CreateTestWindow(subAppInfo_);
227     ASSERT_NE(nullptr, aboveSubWindow);
228     ASSERT_EQ(WMError::WM_OK, aboveSubWindow->Show());
229 
230     floatAppInfo_.name = "FocusChangedTest03_3";
231     floatAppInfo_.rect = { 200, 200, 100, 100 };
232     const sptr<Window>& mainWindow2 = Utils::CreateTestWindow(floatAppInfo_);
233     ASSERT_NE(nullptr, mainWindow2);
234     ASSERT_EQ(WMError::WM_OK, mainWindow2->Show());
235     usleep(WAIT_ASYNC_US);
236     ASSERT_EQ(mainWindow2->GetWindowId(), testFocusChangedListener_->focusedWindow_);
237 
238     ASSERT_EQ(WMError::WM_OK, mainWindow2->Hide());
239     // Await 100ms and get callback result in listener.
240     usleep(WAIT_ASYNC_US);
241     ASSERT_EQ(mainWindow2->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
242     ASSERT_EQ(aboveSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
243 
244     mainWindow1->Destroy();
245     mainWindow2->Destroy();
246     aboveSubWindow->Destroy();
247 }
248 
249 /**
250  * @tc.name: FocusChangedTest04
251  * @tc.desc: hide focused window to test focus
252  * @tc.type: FUNC
253  */
254 HWTEST_F(WindowFocusTest, FocusChangedTest04, TestSize.Level1)
255 {
256     floatAppInfo_.name = "FocusChangedTest04_1";
257     floatAppInfo_.rect = { 10, 200, 300, 400 };
258     const sptr<Window>& mainWindow1 = Utils::CreateTestWindow(floatAppInfo_);
259     ASSERT_NE(nullptr, mainWindow1);
260     ASSERT_EQ(WMError::WM_OK, mainWindow1->Show());
261 
262     subAppInfo_.name = "FocusChangedTest04_2";
263     subAppInfo_.rect = { 400, 200, 100, 100 };
264     subAppInfo_.parentId = mainWindow1->GetWindowId();
265     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
266     const sptr<Window>& belowSubWindow = Utils::CreateTestWindow(subAppInfo_);
267     ASSERT_NE(nullptr, belowSubWindow);
268     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Show());
269 
270     floatAppInfo_.name = "FocusChangedTest04_3";
271     floatAppInfo_.rect = { 200, 200, 100, 100 };
272     const sptr<Window>& mainWindow2 = Utils::CreateTestWindow(floatAppInfo_);
273     ASSERT_NE(nullptr, mainWindow2);
274     ASSERT_EQ(WMError::WM_OK, mainWindow2->Show());
275     usleep(WAIT_ASYNC_US);
276     ASSERT_EQ(mainWindow2->GetWindowId(), testFocusChangedListener_->focusedWindow_);
277 
278     ASSERT_EQ(WMError::WM_OK, mainWindow2->Hide());
279     // Await 100ms and get callback result in listener.
280     usleep(WAIT_ASYNC_US);
281     ASSERT_EQ(mainWindow2->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
282     ASSERT_EQ(mainWindow1->GetWindowId(), testFocusChangedListener_->focusedWindow_);
283 
284     mainWindow1->Destroy();
285     mainWindow2->Destroy();
286     belowSubWindow->Destroy();
287 }
288 
289 /**
290  * @tc.name: FocusChangedTest05
291  * @tc.desc: hide focused window to test focus
292  * @tc.type: FUNC
293  */
294 HWTEST_F(WindowFocusTest, FocusChangedTest05, TestSize.Level1)
295 {
296     floatAppInfo_.name = "FocusChangedTest05_1";
297     floatAppInfo_.rect = { 10, 200, 300, 400 };
298     const sptr<Window>& mainWindow1 = Utils::CreateTestWindow(floatAppInfo_);
299     ASSERT_NE(nullptr, mainWindow1);
300     ASSERT_EQ(WMError::WM_OK, mainWindow1->Show());
301 
302     floatAppInfo_.name = "FocusChangedTest05_2";
303     floatAppInfo_.rect = { 200, 200, 100, 100 };
304     const sptr<Window>& mainWindow2 = Utils::CreateTestWindow(floatAppInfo_);
305     ASSERT_NE(nullptr, mainWindow2);
306     ASSERT_EQ(WMError::WM_OK, mainWindow2->Show());
307 
308     subAppInfo_.name = "FocusChangedTest05_3";
309     subAppInfo_.rect = { 400, 200, 100, 100 };
310     subAppInfo_.parentId = mainWindow2->GetWindowId();
311     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
312     const sptr<Window>& belowSubWindow = Utils::CreateTestWindow(subAppInfo_);
313     ASSERT_NE(nullptr, belowSubWindow);
314     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Show());
315     usleep(WAIT_ASYNC_US);
316     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
317 
318     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Hide());
319     // Await 100ms and get callback result in listener.
320     usleep(WAIT_ASYNC_US);
321     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
322     ASSERT_EQ(mainWindow1->GetWindowId(), testFocusChangedListener_->focusedWindow_);
323 
324     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Show());
325     usleep(WAIT_ASYNC_US);
326     ASSERT_EQ(mainWindow1->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
327     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
328     ASSERT_EQ(WMError::WM_OK, mainWindow2->Hide());
329     usleep(WAIT_ASYNC_US);
330     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
331     ASSERT_EQ(mainWindow1->GetWindowId(), testFocusChangedListener_->focusedWindow_);
332 
333     mainWindow1->Destroy();
334     mainWindow2->Destroy();
335     belowSubWindow->Destroy();
336 }
337 
338 /**
339  * @tc.name: FocusChangedTest06
340  * @tc.desc: hide unfocused window to test focus
341  * @tc.type: FUNC
342  */
343 HWTEST_F(WindowFocusTest, FocusChangedTest06, TestSize.Level1)
344 {
345     floatAppInfo_.name = "FocusChangedTest06_1";
346     floatAppInfo_.rect = { 10, 200, 300, 400 };
347     const sptr<Window>& mainWindow = Utils::CreateTestWindow(floatAppInfo_);
348     ASSERT_NE(nullptr, mainWindow);
349     ASSERT_EQ(WMError::WM_OK, mainWindow->Show());
350 
351     subAppInfo_.name = "FocusChangedTest06_2";
352     subAppInfo_.rect = { 100, 200, 100, 100 };
353     subAppInfo_.parentId = mainWindow->GetWindowId();
354     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
355     const sptr<Window>& belowSubWindow = Utils::CreateTestWindow(subAppInfo_);
356     ASSERT_NE(nullptr, belowSubWindow);
357     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Show());
358 
359     subAppInfo_.name = "FocusChangedTest06_3";
360     subAppInfo_.rect = { 400, 200, 100, 100 };
361     subAppInfo_.parentId = mainWindow->GetWindowId();
362     subAppInfo_.type = WindowType::WINDOW_TYPE_APP_SUB_WINDOW;
363     const sptr<Window>& aboveSubWindow = Utils::CreateTestWindow(subAppInfo_);
364     ASSERT_NE(nullptr, aboveSubWindow);
365     ASSERT_EQ(WMError::WM_OK, aboveSubWindow->Show());
366     usleep(WAIT_ASYNC_US);
367     ASSERT_EQ(aboveSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
368 
369     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Hide());
370     // Await 100ms and get callback result in listener.
371     usleep(WAIT_ASYNC_US);
372     ASSERT_EQ(aboveSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
373 }
374 
375 /**
376  * @tc.name: FocusChangedTest07
377  * @tc.desc: destroy focused window to test focus
378  * @tc.type: FUNC
379  */
380 HWTEST_F(WindowFocusTest, FocusChangedTest07, Function | MediumTest | Level3)
381 {
382     floatAppInfo_.name = "FocusChangedTest07_1";
383     floatAppInfo_.rect = { 10, 200, 300, 400 };
384     const sptr<Window>& mainWindow1 = Utils::CreateTestWindow(floatAppInfo_);
385     ASSERT_NE(nullptr, mainWindow1);
386     ASSERT_EQ(WMError::WM_OK, mainWindow1->Show());
387 
388     floatAppInfo_.name = "FocusChangedTest07_2";
389     floatAppInfo_.rect = { 250, 150, 300, 500 };
390     const sptr<Window>& mainWindow2 = Utils::CreateTestWindow(floatAppInfo_);
391     ASSERT_NE(nullptr, mainWindow2);
392     ASSERT_EQ(WMError::WM_OK, mainWindow2->Show());
393 
394     floatAppInfo_.name = "FocusChangedTest07_3";
395     floatAppInfo_.rect = { 300, 400, 10, 400 };
396     const sptr<Window>& mainWindow3 = Utils::CreateTestWindow(floatAppInfo_);
397     ASSERT_NE(nullptr, mainWindow3);
398     ASSERT_EQ(WMError::WM_OK, mainWindow3->Show());
399 
400     subAppInfo_.name = "FocusChangedTest07_4";
401     subAppInfo_.rect = { 20, 100, 100, 100 };
402     subAppInfo_.parentId = mainWindow1->GetWindowId();
403     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
404     const sptr<Window>& belowSubWindow1 = Utils::CreateTestWindow(subAppInfo_);
405     ASSERT_NE(nullptr, belowSubWindow1);
406 
407     subAppInfo_.name = "FocusChangedTest07_5";
408     subAppInfo_.rect = { 400, 200, 100, 100 };
409     subAppInfo_.parentId = mainWindow2->GetWindowId();
410     subAppInfo_.type = WindowType::WINDOW_TYPE_APP_SUB_WINDOW;
411     const sptr<Window>& aboveSubWindow = Utils::CreateTestWindow(subAppInfo_);
412     ASSERT_NE(nullptr, aboveSubWindow);
413 
414     subAppInfo_.name = "FocusChangedTest07_6";
415     subAppInfo_.rect = { 310, 410, 100, 100 };
416     subAppInfo_.parentId = mainWindow3->GetWindowId();
417     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
418     const sptr<Window>& belowSubWindow2 = Utils::CreateTestWindow(subAppInfo_);
419     ASSERT_NE(nullptr, belowSubWindow2);
420 
421     ASSERT_EQ(WMError::WM_OK, aboveSubWindow->Show());
422     ASSERT_EQ(WMError::WM_OK, belowSubWindow2->Show());
423     ASSERT_EQ(WMError::WM_OK, belowSubWindow1->Show());
424     usleep(WAIT_ASYNC_US);
425     ASSERT_EQ(belowSubWindow1->GetWindowId(), testFocusChangedListener_->focusedWindow_);
426 
427     ASSERT_EQ(WMError::WM_OK, mainWindow1->Destroy());
428     // Await 100ms and get callback result in listener.
429     usleep(WAIT_ASYNC_US);
430     ASSERT_EQ(belowSubWindow1->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
431     ASSERT_EQ(mainWindow3->GetWindowId(), testFocusChangedListener_->focusedWindow_);
432 
433     ASSERT_EQ(WMError::WM_OK, mainWindow3->Destroy());
434     usleep(WAIT_ASYNC_US);
435     ASSERT_EQ(mainWindow3->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
436     ASSERT_EQ(aboveSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
437 
438     ASSERT_EQ(WMError::WM_OK, aboveSubWindow->Destroy());
439     usleep(WAIT_ASYNC_US);
440     ASSERT_EQ(aboveSubWindow->GetWindowId(), testFocusChangedListener_->unfocusedWindow_);
441     ASSERT_EQ(mainWindow2->GetWindowId(), testFocusChangedListener_->focusedWindow_);
442 
443     mainWindow2->Destroy();
444 }
445 
446 /**
447  * @tc.name: FocusChangedTest08
448  * @tc.desc: destroy unfocused window to test focus
449  * @tc.type: FUNC
450  */
451 HWTEST_F(WindowFocusTest, FocusChangedTest08, TestSize.Level1)
452 {
453     floatAppInfo_.name = "FocusChangedTest08_1";
454     floatAppInfo_.rect = { 10, 200, 300, 400 };
455     const sptr<Window>& mainWindow1 = Utils::CreateTestWindow(floatAppInfo_);
456     ASSERT_NE(nullptr, mainWindow1);
457     ASSERT_EQ(WMError::WM_OK, mainWindow1->Show());
458 
459     floatAppInfo_.name = "FocusChangedTest08_2";
460     floatAppInfo_.rect = { 250, 150, 300, 500 };
461     const sptr<Window>& mainWindow2 = Utils::CreateTestWindow(floatAppInfo_);
462     ASSERT_NE(nullptr, mainWindow2);
463     ASSERT_EQ(WMError::WM_OK, mainWindow2->Show());
464 
465     subAppInfo_.name = "FocusChangedTest08_3";
466     subAppInfo_.rect = { 20, 100, 100, 100 };
467     subAppInfo_.parentId = mainWindow1->GetWindowId();
468     subAppInfo_.type = WindowType::WINDOW_TYPE_MEDIA;
469     const sptr<Window>& belowSubWindow = Utils::CreateTestWindow(subAppInfo_);
470     ASSERT_NE(nullptr, belowSubWindow);
471     ASSERT_EQ(WMError::WM_OK, belowSubWindow->Show());
472     usleep(WAIT_ASYNC_US);
473     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
474     ASSERT_EQ(WMError::WM_OK, mainWindow2->Destroy());
475     // Await 100ms and get callback result in listener.
476     usleep(WAIT_ASYNC_US);
477     ASSERT_EQ(belowSubWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
478 
479     mainWindow1->Destroy();
480 }
481 
482 /**
483  * @tc.name: WindowShowWithoutFocusTest
484  * @tc.desc: add main window and sub window and show it to test focus
485  * @tc.type: FUNC
486  */
487 HWTEST_F(WindowFocusTest, WindowShowWithoutFocusTest, TestSize.Level1)
488 {
489     fullScreenAppInfo_.name = "WindowShowWithoutFocusTest_1";
490     const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
491     ASSERT_NE(nullptr, window1);
492 
493     floatAppInfo_.name = "WindowShowWithoutFocusTest_2";
494     const sptr<Window>& window2 = Utils::CreateTestWindow(floatAppInfo_);
495     ASSERT_NE(nullptr, window2);
496 
497     subAppInfo_.name = "WindowShowWithoutFocusTest_3";
498     subAppInfo_.parentId = window2->GetWindowId();
499     const sptr<Window>& subWindow = Utils::CreateTestWindow(subAppInfo_);
500     ASSERT_NE(nullptr, subWindow);
501 
502     ASSERT_EQ(WMError::WM_OK, window1->Show());
503     // Await 100ms and get callback result in listener.
504     usleep(WAIT_ASYNC_US);
505     ASSERT_EQ(window1->GetWindowId(), testFocusChangedListener_->focusedWindow_);
506 
507     ASSERT_EQ(WMError::WM_OK, window2->Show(0, false, false));
508     // Await 100ms and get callback result in listener.
509     usleep(WAIT_ASYNC_US);
510     ASSERT_EQ(window2->GetWindowId(), testFocusChangedListener_->focusedWindow_);
511 
512     ASSERT_EQ(WMError::WM_OK, subWindow->Show(0, false, false));
513     // Await 100ms and get callback result in listener.
514     usleep(WAIT_ASYNC_US);
515     ASSERT_EQ(subWindow->GetWindowId(), testFocusChangedListener_->focusedWindow_);
516 
517     window1->Destroy();
518     window2->Destroy();
519     subWindow->Destroy();
520 }
521 } // namespace
522 } // namespace Rosen
523 } // namespace OHOS
524