| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "athena/home/public/home_card.h" | 5 #include "athena/home/home_card_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "athena/common/container_priorities.h" | 10 #include "athena/common/container_priorities.h" |
| 11 #include "athena/env/public/athena_env.h" | 11 #include "athena/env/public/athena_env.h" |
| 12 #include "athena/home/app_list_view_delegate.h" | 12 #include "athena/home/app_list_view_delegate.h" |
| 13 #include "athena/home/athena_start_page_view.h" | 13 #include "athena/home/athena_start_page_view.h" |
| 14 #include "athena/home/home_card_constants.h" | 14 #include "athena/home/home_card_constants.h" |
| 15 #include "athena/home/home_card_gesture_manager.h" | |
| 16 #include "athena/home/minimized_home.h" | 15 #include "athena/home/minimized_home.h" |
| 17 #include "athena/home/public/app_model_builder.h" | 16 #include "athena/home/public/app_model_builder.h" |
| 18 #include "athena/input/public/accelerator_manager.h" | |
| 19 #include "athena/screen/public/screen_manager.h" | 17 #include "athena/screen/public/screen_manager.h" |
| 20 #include "athena/wm/public/window_manager.h" | 18 #include "athena/wm/public/window_manager.h" |
| 21 #include "athena/wm/public/window_manager_observer.h" | |
| 22 #include "ui/app_list/search_provider.h" | 19 #include "ui/app_list/search_provider.h" |
| 23 #include "ui/app_list/views/app_list_main_view.h" | 20 #include "ui/app_list/views/app_list_main_view.h" |
| 24 #include "ui/app_list/views/contents_view.h" | 21 #include "ui/app_list/views/contents_view.h" |
| 25 #include "ui/aura/layout_manager.h" | 22 #include "ui/aura/layout_manager.h" |
| 26 #include "ui/aura/window.h" | 23 #include "ui/aura/window.h" |
| 27 #include "ui/compositor/layer.h" | 24 #include "ui/compositor/layer.h" |
| 28 #include "ui/compositor/layer_owner.h" | |
| 29 #include "ui/compositor/scoped_layer_animation_settings.h" | 25 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 30 #include "ui/views/layout/fill_layout.h" | 26 #include "ui/views/layout/fill_layout.h" |
| 31 #include "ui/views/widget/widget.h" | 27 #include "ui/views/widget/widget.h" |
| 32 #include "ui/views/widget/widget_delegate.h" | 28 #include "ui/views/widget/widget_delegate.h" |
| 33 #include "ui/wm/core/shadow_types.h" | 29 #include "ui/wm/core/shadow_types.h" |
| 34 #include "ui/wm/core/visibility_controller.h" | 30 #include "ui/wm/core/visibility_controller.h" |
| 35 #include "ui/wm/public/activation_change_observer.h" | |
| 36 #include "ui/wm/public/activation_client.h" | 31 #include "ui/wm/public/activation_client.h" |
| 37 | 32 |
| 38 namespace athena { | 33 namespace athena { |
| 39 namespace { | 34 namespace { |
| 40 | 35 |
| 41 HomeCard* instance = NULL; | 36 HomeCard* instance = NULL; |
| 42 | 37 |
| 43 gfx::Rect GetBoundsForState(const gfx::Rect& screen_bounds, | 38 gfx::Rect GetBoundsForState(const gfx::Rect& screen_bounds, |
| 44 HomeCard::State state) { | 39 HomeCard::State state) { |
| 45 switch (state) { | 40 switch (state) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 60 return gfx::Rect(0, | 55 return gfx::Rect(0, |
| 61 screen_bounds.bottom() - kHomeCardMinimizedHeight, | 56 screen_bounds.bottom() - kHomeCardMinimizedHeight, |
| 62 screen_bounds.width(), | 57 screen_bounds.width(), |
| 63 screen_bounds.height()); | 58 screen_bounds.height()); |
| 64 } | 59 } |
| 65 | 60 |
| 66 NOTREACHED(); | 61 NOTREACHED(); |
| 67 return gfx::Rect(); | 62 return gfx::Rect(); |
| 68 } | 63 } |
| 69 | 64 |
| 65 } // namespace |
| 66 |
| 70 // Makes sure the homecard is center-aligned horizontally and bottom-aligned | 67 // Makes sure the homecard is center-aligned horizontally and bottom-aligned |
| 71 // vertically. | 68 // vertically. |
| 72 class HomeCardLayoutManager : public aura::LayoutManager { | 69 class HomeCardLayoutManager : public aura::LayoutManager { |
| 73 public: | 70 public: |
| 74 HomeCardLayoutManager() | 71 HomeCardLayoutManager() |
| 75 : home_card_(NULL), | 72 : home_card_(NULL), |
| 76 minimized_layer_(NULL) {} | 73 minimized_layer_(NULL) {} |
| 77 | 74 |
| 78 virtual ~HomeCardLayoutManager() {} | 75 virtual ~HomeCardLayoutManager() {} |
| 79 | 76 |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 return this; | 216 return this; |
| 220 } | 217 } |
| 221 | 218 |
| 222 AthenaStartPageView* main_view_; | 219 AthenaStartPageView* main_view_; |
| 223 scoped_ptr<HomeCardGestureManager> gesture_manager_; | 220 scoped_ptr<HomeCardGestureManager> gesture_manager_; |
| 224 HomeCardGestureManager::Delegate* gesture_delegate_; | 221 HomeCardGestureManager::Delegate* gesture_delegate_; |
| 225 | 222 |
| 226 DISALLOW_COPY_AND_ASSIGN(HomeCardView); | 223 DISALLOW_COPY_AND_ASSIGN(HomeCardView); |
| 227 }; | 224 }; |
| 228 | 225 |
| 229 class HomeCardImpl : public HomeCard, | |
| 230 public AcceleratorHandler, | |
| 231 public HomeCardGestureManager::Delegate, | |
| 232 public WindowManagerObserver, | |
| 233 public aura::client::ActivationChangeObserver { | |
| 234 public: | |
| 235 explicit HomeCardImpl(AppModelBuilder* model_builder); | |
| 236 virtual ~HomeCardImpl(); | |
| 237 | |
| 238 void Init(); | |
| 239 | |
| 240 private: | |
| 241 enum Command { | |
| 242 COMMAND_SHOW_HOME_CARD, | |
| 243 }; | |
| 244 void InstallAccelerators(); | |
| 245 void UpdateMinimizedHomeBounds(); | |
| 246 | |
| 247 // Overridden from HomeCard: | |
| 248 virtual void SetState(State state) OVERRIDE; | |
| 249 virtual State GetState() OVERRIDE; | |
| 250 virtual void RegisterSearchProvider( | |
| 251 app_list::SearchProvider* search_provider) OVERRIDE; | |
| 252 virtual void UpdateVirtualKeyboardBounds( | |
| 253 const gfx::Rect& bounds) OVERRIDE; | |
| 254 | |
| 255 // AcceleratorHandler: | |
| 256 virtual bool IsCommandEnabled(int command_id) const OVERRIDE { return true; } | |
| 257 virtual bool OnAcceleratorFired(int command_id, | |
| 258 const ui::Accelerator& accelerator) OVERRIDE; | |
| 259 | |
| 260 // HomeCardGestureManager::Delegate: | |
| 261 virtual void OnGestureEnded(State final_state) OVERRIDE; | |
| 262 virtual void OnGestureProgressed( | |
| 263 State from_state, State to_state, float progress) OVERRIDE; | |
| 264 | |
| 265 // WindowManagerObserver: | |
| 266 virtual void OnOverviewModeEnter() OVERRIDE; | |
| 267 virtual void OnOverviewModeExit() OVERRIDE; | |
| 268 virtual void OnActivityOrderHasChanged() OVERRIDE; | |
| 269 | |
| 270 // aura::client::ActivationChangeObserver: | |
| 271 virtual void OnWindowActivated(aura::Window* gained_active, | |
| 272 aura::Window* lost_active) OVERRIDE; | |
| 273 | |
| 274 scoped_ptr<AppModelBuilder> model_builder_; | |
| 275 | |
| 276 HomeCard::State state_; | |
| 277 | |
| 278 // original_state_ is the state which the home card should go back to after | |
| 279 // the virtual keyboard is hidden. | |
| 280 HomeCard::State original_state_; | |
| 281 | |
| 282 views::Widget* home_card_widget_; | |
| 283 HomeCardView* home_card_view_; | |
| 284 scoped_ptr<AppListViewDelegate> view_delegate_; | |
| 285 HomeCardLayoutManager* layout_manager_; | |
| 286 aura::client::ActivationClient* activation_client_; // Not owned | |
| 287 scoped_ptr<ui::LayerOwner> minimized_home_; | |
| 288 | |
| 289 // Right now HomeCard allows only one search provider. | |
| 290 // TODO(mukai): port app-list's SearchController and Mixer. | |
| 291 scoped_ptr<app_list::SearchProvider> search_provider_; | |
| 292 | |
| 293 DISALLOW_COPY_AND_ASSIGN(HomeCardImpl); | |
| 294 }; | |
| 295 | |
| 296 HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder) | 226 HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder) |
| 297 : model_builder_(model_builder), | 227 : model_builder_(model_builder), |
| 298 state_(HIDDEN), | 228 state_(HIDDEN), |
| 299 original_state_(VISIBLE_MINIMIZED), | 229 original_state_(VISIBLE_MINIMIZED), |
| 300 home_card_widget_(NULL), | 230 home_card_widget_(NULL), |
| 301 home_card_view_(NULL), | 231 home_card_view_(NULL), |
| 302 layout_manager_(NULL), | 232 layout_manager_(NULL), |
| 303 activation_client_(NULL) { | 233 activation_client_(NULL) { |
| 304 DCHECK(!instance); | 234 DCHECK(!instance); |
| 305 instance = this; | 235 instance = this; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 | 283 |
| 354 activation_client_ = | 284 activation_client_ = |
| 355 aura::client::GetActivationClient(container->GetRootWindow()); | 285 aura::client::GetActivationClient(container->GetRootWindow()); |
| 356 if (activation_client_) | 286 if (activation_client_) |
| 357 activation_client_->AddObserver(this); | 287 activation_client_->AddObserver(this); |
| 358 | 288 |
| 359 AthenaEnv::Get()->SetDisplayWorkAreaInsets( | 289 AthenaEnv::Get()->SetDisplayWorkAreaInsets( |
| 360 gfx::Insets(0, 0, kHomeCardMinimizedHeight, 0)); | 290 gfx::Insets(0, 0, kHomeCardMinimizedHeight, 0)); |
| 361 } | 291 } |
| 362 | 292 |
| 293 aura::Window* HomeCardImpl::GetHomeCardWindowForTest() const { |
| 294 return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL; |
| 295 } |
| 296 |
| 363 void HomeCardImpl::InstallAccelerators() { | 297 void HomeCardImpl::InstallAccelerators() { |
| 364 const AcceleratorData accelerator_data[] = { | 298 const AcceleratorData accelerator_data[] = { |
| 365 {TRIGGER_ON_PRESS, ui::VKEY_L, ui::EF_CONTROL_DOWN, | 299 {TRIGGER_ON_PRESS, ui::VKEY_L, ui::EF_CONTROL_DOWN, |
| 366 COMMAND_SHOW_HOME_CARD, AF_NONE}, | 300 COMMAND_SHOW_HOME_CARD, AF_NONE}, |
| 367 }; | 301 }; |
| 368 AcceleratorManager::Get()->RegisterAccelerators( | 302 AcceleratorManager::Get()->RegisterAccelerators( |
| 369 accelerator_data, arraysize(accelerator_data), this); | 303 accelerator_data, arraysize(accelerator_data), this); |
| 370 } | 304 } |
| 371 | 305 |
| 372 void HomeCardImpl::SetState(HomeCard::State state) { | 306 void HomeCardImpl::SetState(HomeCard::State state) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 SetState(HIDDEN); | 353 SetState(HIDDEN); |
| 420 original_state_ = VISIBLE_MINIMIZED; | 354 original_state_ = VISIBLE_MINIMIZED; |
| 421 } else if (state_ == VISIBLE_BOTTOM && !bounds.IsEmpty()) { | 355 } else if (state_ == VISIBLE_BOTTOM && !bounds.IsEmpty()) { |
| 422 SetState(VISIBLE_CENTERED); | 356 SetState(VISIBLE_CENTERED); |
| 423 original_state_ = VISIBLE_BOTTOM; | 357 original_state_ = VISIBLE_BOTTOM; |
| 424 } else if (state_ != original_state_ && bounds.IsEmpty()) { | 358 } else if (state_ != original_state_ && bounds.IsEmpty()) { |
| 425 SetState(original_state_); | 359 SetState(original_state_); |
| 426 } | 360 } |
| 427 } | 361 } |
| 428 | 362 |
| 363 bool HomeCardImpl::IsCommandEnabled(int command_id) const { |
| 364 return true; |
| 365 } |
| 366 |
| 429 bool HomeCardImpl::OnAcceleratorFired(int command_id, | 367 bool HomeCardImpl::OnAcceleratorFired(int command_id, |
| 430 const ui::Accelerator& accelerator) { | 368 const ui::Accelerator& accelerator) { |
| 431 DCHECK_EQ(COMMAND_SHOW_HOME_CARD, command_id); | 369 DCHECK_EQ(COMMAND_SHOW_HOME_CARD, command_id); |
| 432 | 370 |
| 433 if (state_ == VISIBLE_CENTERED && original_state_ != VISIBLE_BOTTOM) | 371 if (state_ == VISIBLE_CENTERED && original_state_ != VISIBLE_BOTTOM) |
| 434 SetState(VISIBLE_MINIMIZED); | 372 SetState(VISIBLE_MINIMIZED); |
| 435 else if (state_ == VISIBLE_MINIMIZED) | 373 else if (state_ == VISIBLE_MINIMIZED) |
| 436 SetState(VISIBLE_CENTERED); | 374 SetState(VISIBLE_CENTERED); |
| 437 return true; | 375 return true; |
| 438 } | 376 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 } | 422 } |
| 485 | 423 |
| 486 void HomeCardImpl::OnWindowActivated(aura::Window* gained_active, | 424 void HomeCardImpl::OnWindowActivated(aura::Window* gained_active, |
| 487 aura::Window* lost_active) { | 425 aura::Window* lost_active) { |
| 488 if (state_ != HIDDEN && | 426 if (state_ != HIDDEN && |
| 489 gained_active != home_card_widget_->GetNativeWindow()) { | 427 gained_active != home_card_widget_->GetNativeWindow()) { |
| 490 SetState(VISIBLE_MINIMIZED); | 428 SetState(VISIBLE_MINIMIZED); |
| 491 } | 429 } |
| 492 } | 430 } |
| 493 | 431 |
| 494 } // namespace | |
| 495 | |
| 496 // static | 432 // static |
| 497 HomeCard* HomeCard::Create(AppModelBuilder* model_builder) { | 433 HomeCard* HomeCard::Create(AppModelBuilder* model_builder) { |
| 498 (new HomeCardImpl(model_builder))->Init(); | 434 (new HomeCardImpl(model_builder))->Init(); |
| 499 DCHECK(instance); | 435 DCHECK(instance); |
| 500 return instance; | 436 return instance; |
| 501 } | 437 } |
| 502 | 438 |
| 503 // static | 439 // static |
| 504 void HomeCard::Shutdown() { | 440 void HomeCard::Shutdown() { |
| 505 DCHECK(instance); | 441 DCHECK(instance); |
| 506 delete instance; | 442 delete instance; |
| 507 instance = NULL; | 443 instance = NULL; |
| 508 } | 444 } |
| 509 | 445 |
| 510 // static | 446 // static |
| 511 HomeCard* HomeCard::Get() { | 447 HomeCard* HomeCard::Get() { |
| 512 DCHECK(instance); | 448 DCHECK(instance); |
| 513 return instance; | 449 return instance; |
| 514 } | 450 } |
| 515 | 451 |
| 516 } // namespace athena | 452 } // namespace athena |
| OLD | NEW |