1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "athena/home/public/home_card.h"
7 #include "athena/activity/public/activity_factory.h"
8 #include "athena/home/home_card_constants.h"
9 #include "athena/home/home_card_impl.h"
10 #include "athena/test/base/athena_test_base.h"
11 #include "athena/test/base/test_windows.h"
12 #include "athena/wm/public/window_manager.h"
13 #include "ui/aura/test/test_window_delegate.h"
14 #include "ui/aura/window.h"
15 #include "ui/events/test/event_generator.h"
16 #include "ui/gfx/display.h"
17 #include "ui/gfx/screen.h"
18 #include "ui/views/controls/textfield/textfield.h"
19 #include "ui/views/focus/focus_manager.h"
20 #include "ui/views/widget/widget.h"
21 #include "ui/wm/core/shadow_types.h"
22 #include "ui/wm/core/window_util.h"
26 aura::Window* GetHomeCardWindow() {
27 return static_cast<HomeCardImpl*>(HomeCard::Get())->
28 GetHomeCardWindowForTest();
31 typedef test::AthenaTestBase HomeCardTest;
33 TEST_F(HomeCardTest, BasicTransition) {
34 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
35 aura::Window* home_card = GetHomeCardWindow();
36 const int screen_height = root_window()->bounds().height();
37 const int work_area_height = gfx::Screen::GetScreenFor(root_window())->
38 GetDisplayNearestWindow(root_window()).work_area().height();
39 ASSERT_TRUE(home_card);
41 // In the minimized state, home card should be outside (below) the work area.
42 EXPECT_EQ(screen_height - kHomeCardMinimizedHeight,
43 home_card->GetTargetBounds().y());
44 EXPECT_EQ(work_area_height, home_card->GetTargetBounds().y());
46 WindowManager::Get()->EnterOverview();
47 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
48 EXPECT_EQ(screen_height - kHomeCardHeight, home_card->GetTargetBounds().y());
50 WindowManager::Get()->ExitOverview();
51 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
52 EXPECT_EQ(work_area_height, home_card->GetTargetBounds().y());
55 TEST_F(HomeCardTest, VirtualKeyboardTransition) {
56 // Minimized -> Hidden for virtual keyboard.
57 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
58 const gfx::Rect vk_bounds(0, 0, 100, 100);
59 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds);
60 EXPECT_EQ(HomeCard::HIDDEN, HomeCard::Get()->GetState());
61 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
62 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
64 // bottom -> centered for virtual keyboard.
65 WindowManager::Get()->EnterOverview();
66 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
67 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds);
68 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
70 aura::Window* home_card = GetHomeCardWindow();
71 EXPECT_EQ(0, home_card->GetTargetBounds().y());
73 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect());
74 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
77 TEST_F(HomeCardTest, ToggleOverviewWithVirtualKeyboard) {
78 // Minimized -> Hidden for virtual keyboard.
79 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
80 const gfx::Rect vk_bounds(0, 0, 100, 100);
81 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds);
82 EXPECT_EQ(HomeCard::HIDDEN, HomeCard::Get()->GetState());
84 // EnterOverview() revives the bottom home card. Home card also gets
85 /// activated which will close the virtual keyboard.
86 WindowManager::Get()->EnterOverview();
87 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
88 aura::Window* home_card = GetHomeCardWindow();
89 EXPECT_TRUE(wm::IsActiveWindow(home_card));
92 // Verify if the home card is correctly minimized after app launch.
93 TEST_F(HomeCardTest, AppSelection) {
94 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
96 WindowManager::Get()->EnterOverview();
97 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
99 athena::ActivityFactory::Get()->CreateWebActivity(
100 nullptr, base::string16(), GURL("http://www.google.com/"));
101 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
104 TEST_F(HomeCardTest, Accelerators) {
105 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
107 ui::test::EventGenerator generator(root_window());
109 // CTRL+L toggles centered home card, check that overview mode follows
110 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN);
111 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
112 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
113 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN);
114 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
115 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
117 // ESC key hides centered home card
118 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN);
119 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
120 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
121 generator.PressKey(ui::VKEY_ESCAPE, ui::EF_NONE);
122 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
123 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
125 // Do nothing with bottom home card with CTRL+L, hide with ESC key
126 WindowManager::Get()->EnterOverview();
127 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
128 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
129 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN);
130 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
131 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
132 generator.PressKey(ui::VKEY_ESCAPE, ui::EF_NONE);
133 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
134 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
136 // Do nothing if the centered state is a temporary state.
137 WindowManager::Get()->EnterOverview();
138 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
139 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
140 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect(0, 0, 100, 100));
141 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
142 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
143 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN);
144 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
145 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
148 TEST_F(HomeCardTest, MouseClick) {
149 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
151 // Mouse click at the bottom of the screen should invokes overview mode and
152 // changes the state to BOTTOM.
153 gfx::Rect screen_rect(root_window()->bounds());
154 ui::test::EventGenerator generator(
155 root_window(), gfx::Point(
156 screen_rect.x() + screen_rect.width() / 2, screen_rect.bottom() - 1));
157 generator.ClickLeftButton();
159 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
160 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
162 // Further clicks are simply ignored.
163 generator.ClickLeftButton();
164 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
165 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
168 TEST_F(HomeCardTest, Gestures) {
169 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
170 ui::test::EventGenerator generator(root_window());
171 gfx::Rect screen_rect(root_window()->bounds());
173 const int bottom = screen_rect.bottom();
174 const int x = screen_rect.x() + 1;
176 generator.GestureScrollSequence(gfx::Point(x, bottom - 1),
177 gfx::Point(x, bottom - 70),
178 base::TimeDelta::FromSeconds(1),
180 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
181 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
183 // Too short moves. Nothing has changed.
184 generator.GestureScrollSequence(gfx::Point(x, bottom - 40),
185 gfx::Point(x, bottom - 80),
186 base::TimeDelta::FromSeconds(1),
188 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
189 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
191 generator.GestureScrollSequence(gfx::Point(x, bottom - 40),
192 gfx::Point(x, bottom - 20),
193 base::TimeDelta::FromSeconds(1),
195 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
196 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
198 // Swipe up to the centered state.
199 generator.GestureScrollSequence(gfx::Point(x, bottom - 40),
200 gfx::Point(x, bottom - 300),
201 base::TimeDelta::FromSeconds(1),
203 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
204 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
206 // Swipe up from centered; nothing has to be changed.
207 generator.GestureScrollSequence(gfx::Point(x, bottom - 300),
208 gfx::Point(x, bottom - 350),
209 base::TimeDelta::FromSeconds(1),
211 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
212 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
214 // Swipe down slightly; nothing has to be changed.
215 generator.GestureScrollSequence(gfx::Point(x, bottom - 300),
216 gfx::Point(x, bottom - 250),
217 base::TimeDelta::FromSeconds(1),
219 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
220 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
222 // Swipe down to the bottom state.
223 generator.GestureScrollSequence(gfx::Point(x, 10),
224 gfx::Point(x, bottom - 120),
225 base::TimeDelta::FromSeconds(1),
227 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
228 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
230 generator.GestureScrollSequence(gfx::Point(x, bottom - 40),
231 gfx::Point(x, bottom - 300),
232 base::TimeDelta::FromSeconds(1),
234 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
235 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
237 // Swipe down to the minimized state.
238 generator.GestureScrollSequence(gfx::Point(x, 10),
239 gfx::Point(x, bottom - 1),
240 base::TimeDelta::FromSeconds(1),
242 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
243 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive());
246 TEST_F(HomeCardTest, GesturesToFullDirectly) {
247 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
248 ui::test::EventGenerator generator(root_window());
249 gfx::Rect screen_rect(root_window()->bounds());
251 const int bottom = screen_rect.bottom();
252 const int x = screen_rect.x() + 1;
254 generator.GestureScrollSequence(gfx::Point(x, bottom - 1),
256 base::TimeDelta::FromSeconds(1),
258 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState());
259 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive());
262 TEST_F(HomeCardTest, DontMinimizeWithModalWindow) {
263 aura::Window* home_card = GetHomeCardWindow();
265 WindowManager::Get()->EnterOverview();
266 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
267 EXPECT_TRUE(wm::IsActiveWindow(home_card));
269 aura::test::TestWindowDelegate delegate;
270 scoped_ptr<aura::Window> modal(test::CreateTransientWindow(
271 &delegate, nullptr, ui::MODAL_TYPE_SYSTEM, false));
273 wm::ActivateWindow(modal.get());
274 EXPECT_TRUE(wm::IsActiveWindow(modal.get()));
275 EXPECT_FALSE(wm::IsActiveWindow(home_card));
276 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
280 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState());
281 EXPECT_TRUE(wm::IsActiveWindow(home_card));
284 } // namespace athena