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 "display_manager_proxy.h"
19 #include "wm_common.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, "WindowOccupiedAreaChangeTest"};
28 }
29
30 using Utils = WindowTestUtils;
31 const int WAIT_ASYNC_US = 100000; // 100000us
32
33 class TestOccupiedAreaChangeListener : public IOccupiedAreaChangeListener {
34 public:
35 OccupiedAreaType type_ = OccupiedAreaType::TYPE_INPUT;
36 Rect rect_ = { 0, 0, 0, 0 };
37 void OnSizeChange(const sptr<OccupiedAreaChangeInfo>& info,
38 const std::shared_ptr<RSTransaction>& rsTransaction = nullptr) override;
39 };
40
41 class WindowOccupiedAreaChangeTest : 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<TestOccupiedAreaChangeListener> testOccupiedAreaChangeListener_;
48 Utils::TestWindowInfo fullScreenAppInfo_;
49 Utils::TestWindowInfo imeAppInfo_;
50 };
51
52 sptr<TestOccupiedAreaChangeListener> WindowOccupiedAreaChangeTest::testOccupiedAreaChangeListener_ =
53 new TestOccupiedAreaChangeListener();
54
OnSizeChange(const sptr<OccupiedAreaChangeInfo> & info,const std::shared_ptr<RSTransaction> & rsTransaction)55 void TestOccupiedAreaChangeListener::OnSizeChange(const sptr<OccupiedAreaChangeInfo>& info,
56 const std::shared_ptr<RSTransaction>& rsTransaction)
57 {
58 WLOGI("OccupiedAreaChangeInfo: [%{public}u, {%{public}u, %{public}u}]",
59 info->type_, info->rect_.width_, info->rect_.height_);
60 type_ = info->type_;
61 rect_ = info->rect_;
62 }
63
SetUpTestCase()64 void WindowOccupiedAreaChangeTest::SetUpTestCase()
65 {
66 auto display = DisplayManager::GetInstance().GetDisplayById(0);
67 ASSERT_TRUE((display != nullptr));
68 WLOGI("GetDefaultDisplay: id %{public}" PRIu64", w %{public}d, h %{public}d, fps %{public}u",
69 display->GetId(), display->GetWidth(), display->GetHeight(), display->GetRefreshRate());
70 Rect displayRect = {0, 0, display->GetWidth(), display->GetHeight()};
71 Utils::InitByDisplayRect(displayRect);
72 }
73
TearDownTestCase()74 void WindowOccupiedAreaChangeTest::TearDownTestCase()
75 {
76 }
77
SetUp()78 void WindowOccupiedAreaChangeTest::SetUp()
79 {
80 fullScreenAppInfo_ = {
81 .name = "FullWindow",
82 .rect = Utils::customAppRect_,
83 .type = WindowType::WINDOW_TYPE_APP_MAIN_WINDOW,
84 .mode = WindowMode::WINDOW_MODE_FULLSCREEN,
85 .needAvoid = false,
86 .parentLimit = false,
87 .parentId = INVALID_WINDOW_ID,
88 };
89 imeAppInfo_ = {
90 .name = "ImeWindow",
91 .rect = Utils::customAppRect_,
92 .type = WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT,
93 .mode = WindowMode::WINDOW_MODE_FLOATING,
94 };
95 }
96
TearDown()97 void WindowOccupiedAreaChangeTest::TearDown()
98 {
99 }
100
101 namespace {
102 /**
103 * @tc.name: KeyboardHeightChangeTest01
104 * @tc.desc: test get keyboard height when WINDOW_TYPE_INPUT_METHOD_FLOAT show
105 * @tc.type: FUNC
106 */
107 HWTEST_F(WindowOccupiedAreaChangeTest, KeyboardHeightChangeTest01, Function | MediumTest | Level3)
108 {
109 fullScreenAppInfo_.name = "KeyboardHeightChangeTest01";
110 const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
111 ASSERT_NE(nullptr, window1);
112 window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
113
114 imeAppInfo_.name = "imeWindow1";
115 imeAppInfo_.rect = { 10, 200, 300, 400 };
116 const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
117 ASSERT_NE(nullptr, window2);
118
119 ASSERT_EQ(WMError::WM_OK, window1->Show());
120 ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
121 ASSERT_EQ(WMError::WM_OK, window2->Show());
122 // Await 100ms and get callback result in listener.
123 usleep(WAIT_ASYNC_US);
124
125 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, window2->GetRect().posX_);
126 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, window2->GetRect().posY_);
127 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, window2->GetRect().width_);
128 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, window2->GetRect().height_);
129 }
130
131 /**
132 * @tc.name: KeyboardHeightChangeTest02
133 * @tc.desc: test get keyboard height when WINDOW_TYPE_INPUT_METHOD_FLOAT hide
134 * @tc.type: FUNC
135 */
136 HWTEST_F(WindowOccupiedAreaChangeTest, KeyboardHeightChangeTest02, Function | MediumTest | Level3)
137 {
138 fullScreenAppInfo_.name = "KeyboardHeightChangeTest02";
139 const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
140 ASSERT_NE(nullptr, window1);
141 window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
142
143 imeAppInfo_.name = "imeWindow2";
144 imeAppInfo_.rect = { 10, 200, 300, 400 };
145 const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
146 ASSERT_NE(nullptr, window2);
147
148 ASSERT_EQ(WMError::WM_OK, window1->Show());
149 ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
150 ASSERT_EQ(WMError::WM_OK, window2->Show());
151 ASSERT_EQ(WMError::WM_OK, window2->Hide());
152 // Await 100ms and get callback result in listener.
153 usleep(WAIT_ASYNC_US);
154 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, 0);
155 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, 0);
156 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, 0);
157 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, 0);
158 }
159
160 /**
161 * @tc.name: KeyboardHeightChangeTest03
162 * @tc.desc: test get keyboard height when WINDOW_TYPE_INPUT_METHOD_FLOAT destroy
163 * @tc.type: FUNC
164 */
165 HWTEST_F(WindowOccupiedAreaChangeTest, KeyboardHeightChangeTest03, Function | MediumTest | Level3)
166 {
167 fullScreenAppInfo_.name = "KeyboardHeightChangeTest03";
168 const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
169 ASSERT_NE(nullptr, window1);
170 window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
171
172 imeAppInfo_.name = "imeWindow3";
173 imeAppInfo_.rect = { 10, 200, 300, 400 };
174 const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
175 ASSERT_NE(nullptr, window2);
176
177 ASSERT_EQ(WMError::WM_OK, window1->Show());
178 ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
179 ASSERT_EQ(WMError::WM_OK, window2->Show());
180 ASSERT_EQ(WMError::WM_OK, window2->Destroy());
181 // Await 100ms and get callback result in listener.
182 usleep(WAIT_ASYNC_US);
183 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, 0);
184 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, 0);
185 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, 0);
186 ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, 0);
187 }
188 }
189 } // namespace Rosen
190 } // namespace OHOS
191