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