• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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