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