| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #include "athena/home/public/home_card.h" | |
| 6 | |
| 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/home/home_card_view.h" | |
| 11 #include "athena/test/base/athena_test_base.h" | |
| 12 #include "athena/test/base/test_windows.h" | |
| 13 #include "athena/wm/public/window_manager.h" | |
| 14 #include "ui/app_list/app_list_model.h" | |
| 15 #include "ui/app_list/app_list_view_delegate.h" | |
| 16 #include "ui/app_list/views/app_list_main_view.h" | |
| 17 #include "ui/app_list/views/contents_view.h" | |
| 18 #include "ui/aura/test/test_window_delegate.h" | |
| 19 #include "ui/aura/window.h" | |
| 20 #include "ui/events/test/event_generator.h" | |
| 21 #include "ui/gfx/display.h" | |
| 22 #include "ui/gfx/screen.h" | |
| 23 #include "ui/views/controls/textfield/textfield.h" | |
| 24 #include "ui/views/focus/focus_manager.h" | |
| 25 #include "ui/views/widget/widget.h" | |
| 26 #include "ui/wm/core/shadow_types.h" | |
| 27 #include "ui/wm/core/window_util.h" | |
| 28 | |
| 29 namespace athena { | |
| 30 | |
| 31 aura::Window* GetHomeCardWindow() { | |
| 32 return static_cast<HomeCardImpl*>(HomeCard::Get())-> | |
| 33 GetHomeCardWindowForTest(); | |
| 34 } | |
| 35 | |
| 36 typedef test::AthenaTestBase HomeCardTest; | |
| 37 | |
| 38 TEST_F(HomeCardTest, BasicTransition) { | |
| 39 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 40 aura::Window* home_card = GetHomeCardWindow(); | |
| 41 const int screen_height = root_window()->bounds().height(); | |
| 42 const int work_area_height = gfx::Screen::GetScreenFor(root_window())-> | |
| 43 GetDisplayNearestWindow(root_window()).work_area().height(); | |
| 44 ASSERT_TRUE(home_card); | |
| 45 | |
| 46 // In the minimized state, home card should be outside (below) the work area. | |
| 47 EXPECT_EQ(screen_height - kHomeCardMinimizedHeight, | |
| 48 home_card->GetTargetBounds().y()); | |
| 49 EXPECT_EQ(work_area_height, home_card->GetTargetBounds().y()); | |
| 50 | |
| 51 WindowManager::Get()->EnterOverview(); | |
| 52 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 53 EXPECT_EQ(screen_height - kHomeCardHeight, home_card->GetTargetBounds().y()); | |
| 54 | |
| 55 WindowManager::Get()->ExitOverview(); | |
| 56 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 57 EXPECT_EQ(work_area_height, home_card->GetTargetBounds().y()); | |
| 58 } | |
| 59 | |
| 60 TEST_F(HomeCardTest, VirtualKeyboardTransition) { | |
| 61 // Minimized -> Hidden for virtual keyboard. | |
| 62 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 63 const gfx::Rect vk_bounds(0, 0, 100, 100); | |
| 64 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds); | |
| 65 EXPECT_EQ(HomeCard::HIDDEN, HomeCard::Get()->GetState()); | |
| 66 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect()); | |
| 67 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 68 | |
| 69 // bottom -> centered for virtual keyboard. | |
| 70 WindowManager::Get()->EnterOverview(); | |
| 71 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 72 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds); | |
| 73 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 74 | |
| 75 aura::Window* home_card = GetHomeCardWindow(); | |
| 76 EXPECT_EQ(0, home_card->GetTargetBounds().y()); | |
| 77 | |
| 78 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect()); | |
| 79 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 80 } | |
| 81 | |
| 82 TEST_F(HomeCardTest, ToggleOverviewWithVirtualKeyboard) { | |
| 83 // Minimized -> Hidden for virtual keyboard. | |
| 84 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 85 const gfx::Rect vk_bounds(0, 0, 100, 100); | |
| 86 HomeCard::Get()->UpdateVirtualKeyboardBounds(vk_bounds); | |
| 87 EXPECT_EQ(HomeCard::HIDDEN, HomeCard::Get()->GetState()); | |
| 88 | |
| 89 // EnterOverview() revives the bottom home card. Home card also gets | |
| 90 /// activated which will close the virtual keyboard. | |
| 91 WindowManager::Get()->EnterOverview(); | |
| 92 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 93 aura::Window* home_card = GetHomeCardWindow(); | |
| 94 EXPECT_TRUE(wm::IsActiveWindow(home_card)); | |
| 95 } | |
| 96 | |
| 97 // Verify if the home card is correctly minimized after app launch. | |
| 98 TEST_F(HomeCardTest, AppSelection) { | |
| 99 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 100 | |
| 101 WindowManager::Get()->EnterOverview(); | |
| 102 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 103 | |
| 104 athena::ActivityFactory::Get()->CreateWebActivity( | |
| 105 nullptr, base::string16(), GURL("http://www.google.com/")); | |
| 106 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 107 } | |
| 108 | |
| 109 TEST_F(HomeCardTest, Accelerators) { | |
| 110 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 111 | |
| 112 ui::test::EventGenerator generator(root_window()); | |
| 113 | |
| 114 // CTRL+L toggles centered home card, check that overview mode follows | |
| 115 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN); | |
| 116 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 117 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 118 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN); | |
| 119 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 120 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive()); | |
| 121 | |
| 122 // ESC key hides centered home card | |
| 123 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN); | |
| 124 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 125 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 126 generator.PressKey(ui::VKEY_ESCAPE, ui::EF_NONE); | |
| 127 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 128 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive()); | |
| 129 | |
| 130 // Do nothing with bottom home card with CTRL+L, hide with ESC key | |
| 131 WindowManager::Get()->EnterOverview(); | |
| 132 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 133 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 134 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN); | |
| 135 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 136 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 137 generator.PressKey(ui::VKEY_ESCAPE, ui::EF_NONE); | |
| 138 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 139 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive()); | |
| 140 | |
| 141 // Do nothing if the centered state is a temporary state. | |
| 142 WindowManager::Get()->EnterOverview(); | |
| 143 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 144 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 145 HomeCard::Get()->UpdateVirtualKeyboardBounds(gfx::Rect(0, 0, 100, 100)); | |
| 146 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 147 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 148 generator.PressKey(ui::VKEY_L, ui::EF_CONTROL_DOWN); | |
| 149 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 150 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 151 } | |
| 152 | |
| 153 TEST_F(HomeCardTest, MouseClick) { | |
| 154 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 155 | |
| 156 // Mouse click at the bottom of the screen should invokes overview mode and | |
| 157 // changes the state to BOTTOM. | |
| 158 gfx::Rect screen_rect(root_window()->bounds()); | |
| 159 ui::test::EventGenerator generator( | |
| 160 root_window(), gfx::Point( | |
| 161 screen_rect.x() + screen_rect.width() / 2, screen_rect.bottom() - 1)); | |
| 162 generator.ClickLeftButton(); | |
| 163 | |
| 164 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 165 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 166 | |
| 167 // Further clicks are simply ignored. | |
| 168 generator.ClickLeftButton(); | |
| 169 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 170 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 171 } | |
| 172 | |
| 173 TEST_F(HomeCardTest, Gestures) { | |
| 174 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 175 ui::test::EventGenerator generator(root_window()); | |
| 176 gfx::Rect screen_rect(root_window()->bounds()); | |
| 177 | |
| 178 const int bottom = screen_rect.bottom(); | |
| 179 const int x = screen_rect.x() + 1; | |
| 180 | |
| 181 generator.GestureScrollSequence(gfx::Point(x, bottom - 1), | |
| 182 gfx::Point(x, bottom - 70), | |
| 183 base::TimeDelta::FromSeconds(1), | |
| 184 10); | |
| 185 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 186 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 187 | |
| 188 // Too short moves. Nothing has changed. | |
| 189 generator.GestureScrollSequence(gfx::Point(x, bottom - 40), | |
| 190 gfx::Point(x, bottom - 80), | |
| 191 base::TimeDelta::FromSeconds(1), | |
| 192 10); | |
| 193 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 194 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 195 | |
| 196 generator.GestureScrollSequence(gfx::Point(x, bottom - 40), | |
| 197 gfx::Point(x, bottom - 20), | |
| 198 base::TimeDelta::FromSeconds(1), | |
| 199 10); | |
| 200 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 201 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 202 | |
| 203 // Swipe up to the centered state. | |
| 204 generator.GestureScrollSequence(gfx::Point(x, bottom - 40), | |
| 205 gfx::Point(x, bottom - 300), | |
| 206 base::TimeDelta::FromSeconds(1), | |
| 207 10); | |
| 208 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 209 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 210 | |
| 211 // Swipe up from centered; nothing has to be changed. | |
| 212 generator.GestureScrollSequence(gfx::Point(x, bottom - 300), | |
| 213 gfx::Point(x, bottom - 350), | |
| 214 base::TimeDelta::FromSeconds(1), | |
| 215 10); | |
| 216 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 217 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 218 | |
| 219 // Swipe down slightly; nothing has to be changed. | |
| 220 generator.GestureScrollSequence(gfx::Point(x, bottom - 300), | |
| 221 gfx::Point(x, bottom - 250), | |
| 222 base::TimeDelta::FromSeconds(1), | |
| 223 10); | |
| 224 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 225 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 226 | |
| 227 // Swipe down to the bottom state. | |
| 228 generator.GestureScrollSequence(gfx::Point(x, 50), | |
| 229 gfx::Point(x, bottom - 120), | |
| 230 base::TimeDelta::FromSeconds(1), 10); | |
| 231 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 232 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 233 | |
| 234 generator.GestureScrollSequence(gfx::Point(x, bottom - 40), | |
| 235 gfx::Point(x, bottom - 300), | |
| 236 base::TimeDelta::FromSeconds(1), | |
| 237 10); | |
| 238 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 239 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 240 | |
| 241 // Swipe down to the minimized state. | |
| 242 generator.GestureScrollSequence(gfx::Point(x, 50), gfx::Point(x, bottom - 1), | |
| 243 base::TimeDelta::FromSeconds(1), 10); | |
| 244 EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 245 EXPECT_FALSE(WindowManager::Get()->IsOverviewModeActive()); | |
| 246 } | |
| 247 | |
| 248 TEST_F(HomeCardTest, GesturesToFullDirectly) { | |
| 249 ASSERT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState()); | |
| 250 ui::test::EventGenerator generator(root_window()); | |
| 251 gfx::Rect screen_rect(root_window()->bounds()); | |
| 252 | |
| 253 const int bottom = screen_rect.bottom(); | |
| 254 const int x = screen_rect.x() + 1; | |
| 255 | |
| 256 generator.GestureScrollSequence(gfx::Point(x, bottom - 1), | |
| 257 gfx::Point(x, 20), | |
| 258 base::TimeDelta::FromSeconds(1), | |
| 259 10); | |
| 260 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 261 EXPECT_TRUE(WindowManager::Get()->IsOverviewModeActive()); | |
| 262 } | |
| 263 | |
| 264 TEST_F(HomeCardTest, DontMinimizeWithModalWindow) { | |
| 265 aura::Window* home_card = GetHomeCardWindow(); | |
| 266 | |
| 267 WindowManager::Get()->EnterOverview(); | |
| 268 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 269 EXPECT_TRUE(wm::IsActiveWindow(home_card)); | |
| 270 | |
| 271 aura::test::TestWindowDelegate delegate; | |
| 272 scoped_ptr<aura::Window> modal(test::CreateTransientWindow( | |
| 273 &delegate, nullptr, ui::MODAL_TYPE_SYSTEM, false)); | |
| 274 modal->Show(); | |
| 275 wm::ActivateWindow(modal.get()); | |
| 276 EXPECT_TRUE(wm::IsActiveWindow(modal.get())); | |
| 277 EXPECT_FALSE(wm::IsActiveWindow(home_card)); | |
| 278 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 279 | |
| 280 modal.reset(); | |
| 281 | |
| 282 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 283 EXPECT_TRUE(wm::IsActiveWindow(home_card)); | |
| 284 } | |
| 285 | |
| 286 TEST_F(HomeCardTest, AppListStates) { | |
| 287 app_list::AppListModel* model = | |
| 288 static_cast<HomeCardImpl*>(HomeCard::Get())->view_delegate_->GetModel(); | |
| 289 | |
| 290 WindowManager::Get()->EnterOverview(); | |
| 291 ASSERT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 292 ASSERT_EQ(app_list::AppListModel::STATE_START, model->state()); | |
| 293 | |
| 294 // Changes the contents of the home card to "apps" view, which should change | |
| 295 // the home card state to VISIBLE_CENTERED. | |
| 296 app_list::ContentsView* contents_view = | |
| 297 static_cast<HomeCardImpl*>(HomeCard::Get()) | |
| 298 ->home_card_view_->main_view_->contents_view(); | |
| 299 contents_view->SetActivePage( | |
| 300 contents_view->GetPageIndexForState(app_list::AppListModel::STATE_APPS)); | |
| 301 EXPECT_EQ(HomeCard::VISIBLE_CENTERED, HomeCard::Get()->GetState()); | |
| 302 EXPECT_EQ(app_list::AppListModel::STATE_APPS, model->state()); | |
| 303 | |
| 304 // VISIBLE_BOTTOM state should always show the start page. | |
| 305 HomeCard::Get()->SetState(HomeCard::VISIBLE_BOTTOM); | |
| 306 EXPECT_EQ(app_list::AppListModel::STATE_START, model->state()); | |
| 307 | |
| 308 // VISIBLE_CENTERED with apps mode state to minimized -- and then back to | |
| 309 // VISIBLE_BOTTOM. | |
| 310 contents_view->SetActivePage( | |
| 311 contents_view->GetPageIndexForState(app_list::AppListModel::STATE_APPS)); | |
| 312 EXPECT_EQ(app_list::AppListModel::STATE_APPS, model->state()); | |
| 313 WindowManager::Get()->ExitOverview(); | |
| 314 WindowManager::Get()->EnterOverview(); | |
| 315 EXPECT_EQ(HomeCard::VISIBLE_BOTTOM, HomeCard::Get()->GetState()); | |
| 316 EXPECT_EQ(app_list::AppListModel::STATE_START, model->state()); | |
| 317 } | |
| 318 | |
| 319 } // namespace athena | |
| OLD | NEW |