• 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 "wm_common.h"
19 #include "window_manager.h"
20 #include "window_test_utils.h"
21 #include "scene_board_judgement.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_ =
55     new TestFocusChangedListener();
56 
OnFocused(const sptr<FocusChangeInfo> & focusChangeInfo)57 void TestFocusChangedListener::OnFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
58 {
59     WLOGI("TestFocusChangedListener Focused ID: %{public}u", focusChangeInfo->windowId_);
60     focusedWindow_ = focusChangeInfo->windowId_;
61 }
62 
OnUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)63 void TestFocusChangedListener::OnUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
64 {
65     WLOGI("TestFocusChangedListener Unfocused ID: %{public}u", focusChangeInfo->windowId_);
66     unfocusedWindow_ = focusChangeInfo->windowId_;
67 }
68 
SetUpTestCase()69 void WindowFocusTest::SetUpTestCase()
70 {
71     auto display = DisplayManager::GetInstance().GetDisplayById(0);
72     ASSERT_TRUE((display != nullptr));
73     WLOGI("GetDefaultDisplay: id %{public}" PRIu64", w %{public}d, h %{public}d, fps %{public}u",
74         display->GetId(), display->GetWidth(), display->GetHeight(), display->GetRefreshRate());
75     Rect displayRect = {0, 0, display->GetWidth(), display->GetHeight()};
76     Utils::InitByDisplayRect(displayRect);
77 }
78 
TearDownTestCase()79 void WindowFocusTest::TearDownTestCase()
80 {
81 }
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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, Function | MediumTest | Level3)
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 }
522 } // namespace Rosen
523 } // namespace OHOS
524