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