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