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