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