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     if (window1 == nullptr) {
112         return;
113     }
114     ASSERT_NE(nullptr, window1);
115     window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
116 
117     imeAppInfo_.name = "imeWindow1";
118     imeAppInfo_.rect = { 10, 200, 300, 400 };
119     const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
120     ASSERT_NE(nullptr, window2);
121 
122     ASSERT_EQ(WMError::WM_OK, window1->Show());
123     ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
124     ASSERT_EQ(WMError::WM_OK, window2->Show());
125     // Await 100ms and get callback result in listener.
126     usleep(WAIT_ASYNC_US);
127 
128     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, window2->GetRect().posX_);
129     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, window2->GetRect().posY_);
130     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, window2->GetRect().width_);
131     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, window2->GetRect().height_);
132 }
133 
134 /**
135  * @tc.name: KeyboardHeightChangeTest02
136  * @tc.desc: test get keyboard height when WINDOW_TYPE_INPUT_METHOD_FLOAT hide
137  * @tc.type: FUNC
138  */
139 HWTEST_F(WindowOccupiedAreaChangeTest, KeyboardHeightChangeTest02, Function | MediumTest | Level3)
140 {
141     fullScreenAppInfo_.name = "KeyboardHeightChangeTest02";
142     const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
143     if (window1 == nullptr) {
144         return;
145     }
146     ASSERT_NE(nullptr, window1);
147     window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
148 
149     imeAppInfo_.name = "imeWindow2";
150     imeAppInfo_.rect = { 10, 200, 300, 400 };
151     const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
152     ASSERT_NE(nullptr, window2);
153 
154     ASSERT_EQ(WMError::WM_OK, window1->Show());
155     ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
156     ASSERT_EQ(WMError::WM_OK, window2->Show());
157     ASSERT_EQ(WMError::WM_OK, window2->Hide());
158     // Await 100ms and get callback result in listener.
159     usleep(WAIT_ASYNC_US);
160     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, 0);
161     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, 0);
162     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, 0);
163     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, 0);
164 }
165 
166 /**
167  * @tc.name: KeyboardHeightChangeTest03
168  * @tc.desc: test get keyboard height when WINDOW_TYPE_INPUT_METHOD_FLOAT destroy
169  * @tc.type: FUNC
170  */
171 HWTEST_F(WindowOccupiedAreaChangeTest, KeyboardHeightChangeTest03, Function | MediumTest | Level3)
172 {
173     fullScreenAppInfo_.name = "KeyboardHeightChangeTest03";
174     const sptr<Window>& window1 = Utils::CreateTestWindow(fullScreenAppInfo_);
175     if (window1 == nullptr) {
176         return;
177     }
178     ASSERT_NE(nullptr, window1);
179     window1->RegisterOccupiedAreaChangeListener(testOccupiedAreaChangeListener_);
180 
181     imeAppInfo_.name = "imeWindow3";
182     imeAppInfo_.rect = { 10, 200, 300, 400 };
183     const sptr<Window>& window2 = Utils::CreateTestWindow(imeAppInfo_);
184     ASSERT_NE(nullptr, window2);
185 
186     ASSERT_EQ(WMError::WM_OK, window1->Show());
187     ASSERT_EQ(WMError::WM_OK, window2->SetCallingWindow(window1->GetWindowId()));
188     ASSERT_EQ(WMError::WM_OK, window2->Show());
189     ASSERT_EQ(WMError::WM_OK, window2->Destroy());
190     // Await 100ms and get callback result in listener.
191     usleep(WAIT_ASYNC_US);
192     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posX_, 0);
193     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.posY_, 0);
194     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.width_, 0);
195     ASSERT_EQ(testOccupiedAreaChangeListener_->rect_.height_, 0);
196 }
197 }
198 } // namespace Rosen
199 } // namespace OHOS
200