| 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/public/home_card.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/minimized_home.h" | 14 #include "athena/home/minimized_home.h" |
| 15 #include "athena/home/public/app_model_builder.h" | 15 #include "athena/home/public/app_model_builder.h" |
| 16 #include "athena/input/public/accelerator_manager.h" | 16 #include "athena/input/public/accelerator_manager.h" |
| 17 #include "athena/screen/public/screen_manager.h" | 17 #include "athena/screen/public/screen_manager.h" |
| 18 #include "athena/wm/public/window_manager.h" | 18 #include "athena/wm/public/window_manager.h" |
| 19 #include "athena/wm/public/window_manager_observer.h" | 19 #include "athena/wm/public/window_manager_observer.h" |
| 20 #include "base/bind.h" | |
| 21 #include "base/memory/weak_ptr.h" | |
| 22 #include "ui/app_list/search_provider.h" | 20 #include "ui/app_list/search_provider.h" |
| 23 #include "ui/app_list/views/app_list_main_view.h" | 21 #include "ui/app_list/views/app_list_main_view.h" |
| 24 #include "ui/app_list/views/contents_view.h" | 22 #include "ui/app_list/views/contents_view.h" |
| 25 #include "ui/aura/layout_manager.h" | 23 #include "ui/aura/layout_manager.h" |
| 26 #include "ui/aura/window.h" | 24 #include "ui/aura/window.h" |
| 27 #include "ui/compositor/closure_animation_observer.h" | 25 #include "ui/compositor/layer.h" |
| 26 #include "ui/compositor/layer_owner.h" |
| 28 #include "ui/compositor/scoped_layer_animation_settings.h" | 27 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 29 #include "ui/views/background.h" | 28 #include "ui/views/layout/fill_layout.h" |
| 30 #include "ui/views/layout/box_layout.h" | |
| 31 #include "ui/views/widget/widget.h" | 29 #include "ui/views/widget/widget.h" |
| 32 #include "ui/views/widget/widget_delegate.h" | 30 #include "ui/views/widget/widget_delegate.h" |
| 33 #include "ui/wm/core/shadow_types.h" | 31 #include "ui/wm/core/shadow_types.h" |
| 34 #include "ui/wm/core/visibility_controller.h" | 32 #include "ui/wm/core/visibility_controller.h" |
| 35 #include "ui/wm/core/window_animations.h" | |
| 36 #include "ui/wm/public/activation_change_observer.h" | 33 #include "ui/wm/public/activation_change_observer.h" |
| 37 #include "ui/wm/public/activation_client.h" | 34 #include "ui/wm/public/activation_client.h" |
| 38 | 35 |
| 39 namespace athena { | 36 namespace athena { |
| 40 namespace { | 37 namespace { |
| 41 | 38 |
| 42 HomeCard* instance = NULL; | 39 HomeCard* instance = NULL; |
| 43 const int kHomeCardHeight = 100; | 40 const int kHomeCardHeight = 100; |
| 44 const int kHomeCardMinimizedHeight = 6; | 41 const int kHomeCardMinimizedHeight = 6; |
| 45 | 42 |
| 46 gfx::Rect GetBoundsForState(const gfx::Rect& screen_bounds, | 43 gfx::Rect GetBoundsForState(const gfx::Rect& screen_bounds, |
| 47 HomeCard::State state) { | 44 HomeCard::State state) { |
| 48 switch (state) { | 45 switch (state) { |
| 49 case HomeCard::HIDDEN: | 46 case HomeCard::HIDDEN: |
| 50 break; | 47 break; |
| 51 | 48 |
| 52 case HomeCard::VISIBLE_CENTERED: | 49 case HomeCard::VISIBLE_CENTERED: |
| 53 return screen_bounds; | 50 return screen_bounds; |
| 54 | 51 |
| 52 // Do not change the home_card's size, only changes the top position |
| 53 // instead, because size change causes unnecessary re-layouts. |
| 55 case HomeCard::VISIBLE_BOTTOM: | 54 case HomeCard::VISIBLE_BOTTOM: |
| 56 return gfx::Rect(0, | 55 return gfx::Rect(0, |
| 57 screen_bounds.bottom() - kHomeCardHeight, | 56 screen_bounds.bottom() - kHomeCardHeight, |
| 58 screen_bounds.width(), | 57 screen_bounds.width(), |
| 59 kHomeCardHeight); | 58 screen_bounds.height()); |
| 60 case HomeCard::VISIBLE_MINIMIZED: | 59 case HomeCard::VISIBLE_MINIMIZED: |
| 61 return gfx::Rect(0, | 60 return gfx::Rect(0, |
| 62 screen_bounds.bottom() - kHomeCardMinimizedHeight, | 61 screen_bounds.bottom() - kHomeCardMinimizedHeight, |
| 63 screen_bounds.width(), | 62 screen_bounds.width(), |
| 64 kHomeCardMinimizedHeight); | 63 screen_bounds.height()); |
| 65 } | 64 } |
| 66 | 65 |
| 67 NOTREACHED(); | 66 NOTREACHED(); |
| 68 return gfx::Rect(); | 67 return gfx::Rect(); |
| 69 } | 68 } |
| 70 | 69 |
| 71 // Makes sure the homecard is center-aligned horizontally and bottom-aligned | 70 // Makes sure the homecard is center-aligned horizontally and bottom-aligned |
| 72 // vertically. | 71 // vertically. |
| 73 class HomeCardLayoutManager : public aura::LayoutManager { | 72 class HomeCardLayoutManager : public aura::LayoutManager { |
| 74 public: | 73 public: |
| 75 class Delegate { | 74 class Delegate { |
| 76 public: | 75 public: |
| 77 virtual ~Delegate() {} | 76 virtual ~Delegate() {} |
| 78 | 77 |
| 79 virtual HomeCard::State GetState() = 0; | 78 virtual HomeCard::State GetState() = 0; |
| 80 virtual aura::Window* GetNativeWindow() = 0; | 79 virtual aura::Window* GetNativeWindow() = 0; |
| 81 }; | 80 }; |
| 82 | 81 |
| 83 explicit HomeCardLayoutManager(Delegate* delegate) | 82 explicit HomeCardLayoutManager(Delegate* delegate) |
| 84 : delegate_(delegate) {} | 83 : delegate_(delegate), |
| 84 minimized_layer_(NULL) {} |
| 85 | 85 |
| 86 virtual ~HomeCardLayoutManager() {} | 86 virtual ~HomeCardLayoutManager() {} |
| 87 | 87 |
| 88 void Layout() { | 88 void Layout(bool animate) { |
| 89 aura::Window* home_card = delegate_->GetNativeWindow(); | 89 aura::Window* home_card = delegate_->GetNativeWindow(); |
| 90 // |home_card| could be detached from the root window (e.g. when it is being | 90 // |home_card| could be detached from the root window (e.g. when it is being |
| 91 // destroyed). | 91 // destroyed). |
| 92 if (!home_card || !home_card->GetRootWindow()) | 92 if (!home_card || !home_card->GetRootWindow()) |
| 93 return; | 93 return; |
| 94 | 94 |
| 95 { | 95 scoped_ptr<ui::ScopedLayerAnimationSettings> settings; |
| 96 ui::ScopedLayerAnimationSettings settings( | 96 if (animate) { |
| 97 home_card->layer()->GetAnimator()); | 97 settings.reset(new ui::ScopedLayerAnimationSettings( |
| 98 settings.SetTweenType(gfx::Tween::EASE_IN_OUT); | 98 home_card->layer()->GetAnimator())); |
| 99 SetChildBoundsDirect(home_card, GetBoundsForState( | 99 settings->SetTweenType(gfx::Tween::EASE_IN_OUT); |
| 100 home_card->GetRootWindow()->bounds(), delegate_->GetState())); | |
| 101 } | 100 } |
| 101 SetChildBoundsDirect(home_card, GetBoundsForState( |
| 102 home_card->GetRootWindow()->bounds(), delegate_->GetState())); |
| 103 } |
| 104 |
| 105 void SetMinimizedLayer(ui::Layer* minimized_layer) { |
| 106 minimized_layer_ = minimized_layer; |
| 107 UpdateMinimizedHomeBounds(); |
| 102 } | 108 } |
| 103 | 109 |
| 104 private: | 110 private: |
| 111 void UpdateMinimizedHomeBounds() { |
| 112 gfx::Rect minimized_bounds = minimized_layer_->parent()->bounds(); |
| 113 minimized_bounds.set_y( |
| 114 minimized_bounds.bottom() - kHomeCardMinimizedHeight); |
| 115 minimized_bounds.set_height(kHomeCardMinimizedHeight); |
| 116 minimized_layer_->SetBounds(minimized_bounds); |
| 117 } |
| 118 |
| 105 // aura::LayoutManager: | 119 // aura::LayoutManager: |
| 106 virtual void OnWindowResized() OVERRIDE { Layout(); } | 120 virtual void OnWindowResized() OVERRIDE { |
| 107 virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE { Layout(); } | 121 Layout(false); |
| 122 UpdateMinimizedHomeBounds(); |
| 123 } |
| 124 virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE { |
| 125 Layout(false); |
| 126 } |
| 108 virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {} | 127 virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {} |
| 109 virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE { | 128 virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE { |
| 110 Layout(); | 129 Layout(false); |
| 111 } | 130 } |
| 112 virtual void OnChildWindowVisibilityChanged(aura::Window* child, | 131 virtual void OnChildWindowVisibilityChanged(aura::Window* child, |
| 113 bool visible) OVERRIDE { | 132 bool visible) OVERRIDE { |
| 114 Layout(); | 133 Layout(false); |
| 115 } | 134 } |
| 116 virtual void SetChildBounds(aura::Window* child, | 135 virtual void SetChildBounds(aura::Window* child, |
| 117 const gfx::Rect& requested_bounds) OVERRIDE { | 136 const gfx::Rect& requested_bounds) OVERRIDE { |
| 118 SetChildBoundsDirect(child, requested_bounds); | 137 SetChildBoundsDirect(child, requested_bounds); |
| 119 } | 138 } |
| 120 | 139 |
| 121 Delegate* delegate_; | 140 Delegate* delegate_; |
| 141 ui::Layer* minimized_layer_; |
| 122 | 142 |
| 123 DISALLOW_COPY_AND_ASSIGN(HomeCardLayoutManager); | 143 DISALLOW_COPY_AND_ASSIGN(HomeCardLayoutManager); |
| 124 }; | 144 }; |
| 125 | 145 |
| 126 class HomeCardGestureManager { | 146 class HomeCardGestureManager { |
| 127 public: | 147 public: |
| 128 class Delegate { | 148 class Delegate { |
| 129 public: | 149 public: |
| 130 // Called when the gesture has ended. The state of the home card will | 150 // Called when the gesture has ended. The state of the home card will |
| 131 // end up with |final_state|. | 151 // end up with |final_state|. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 | 287 |
| 268 DISALLOW_COPY_AND_ASSIGN(HomeCardGestureManager); | 288 DISALLOW_COPY_AND_ASSIGN(HomeCardGestureManager); |
| 269 }; | 289 }; |
| 270 | 290 |
| 271 // The container view of home card contents of each state. | 291 // The container view of home card contents of each state. |
| 272 class HomeCardView : public views::WidgetDelegateView { | 292 class HomeCardView : public views::WidgetDelegateView { |
| 273 public: | 293 public: |
| 274 HomeCardView(app_list::AppListViewDelegate* view_delegate, | 294 HomeCardView(app_list::AppListViewDelegate* view_delegate, |
| 275 aura::Window* container, | 295 aura::Window* container, |
| 276 HomeCardGestureManager::Delegate* gesture_delegate) | 296 HomeCardGestureManager::Delegate* gesture_delegate) |
| 277 : gesture_delegate_(gesture_delegate), | 297 : gesture_delegate_(gesture_delegate) { |
| 278 weak_factory_(this) { | 298 SetLayoutManager(new views::FillLayout()); |
| 279 // Ideally AppListMainView should be used here and have AthenaStartPageView | 299 // Ideally AppListMainView should be used here and have AthenaStartPageView |
| 280 // as its child view, so that custom pages and apps grid are available in | 300 // as its child view, so that custom pages and apps grid are available in |
| 281 // the home card. | 301 // the home card. |
| 282 // TODO(mukai): make it so after the detailed UI has been fixed. | 302 // TODO(mukai): make it so after the detailed UI has been fixed. |
| 283 main_view_ = new AthenaStartPageView(view_delegate); | 303 main_view_ = new AthenaStartPageView(view_delegate); |
| 284 AddChildView(main_view_); | 304 AddChildView(main_view_); |
| 285 | |
| 286 minimized_view_ = CreateMinimizedHome(); | |
| 287 minimized_view_->SetPaintToLayer(true); | |
| 288 AddChildView(minimized_view_); | |
| 289 } | 305 } |
| 290 | 306 |
| 291 void SetStateProgress(HomeCard::State from_state, | 307 void SetStateProgress(HomeCard::State from_state, |
| 292 HomeCard::State to_state, | 308 HomeCard::State to_state, |
| 293 float progress) { | 309 float progress) { |
| 294 if (from_state == HomeCard::VISIBLE_BOTTOM && | 310 if (from_state == HomeCard::VISIBLE_CENTERED) |
| 295 to_state == HomeCard::VISIBLE_MINIMIZED) { | 311 main_view_->SetLayoutState(1.0f - progress); |
| 296 SetStateProgress(to_state, from_state, 1.0 - progress); | 312 else if (to_state == HomeCard::VISIBLE_CENTERED) |
| 297 return; | 313 main_view_->SetLayoutState(progress); |
| 298 } | 314 else |
| 299 | 315 SetState(to_state); |
| 300 // View from minimized to bottom. | |
| 301 if (from_state == HomeCard::VISIBLE_MINIMIZED && | |
| 302 to_state == HomeCard::VISIBLE_BOTTOM) { | |
| 303 main_view_->SetVisible(true); | |
| 304 minimized_view_->SetVisible(true); | |
| 305 minimized_view_->layer()->SetOpacity(1.0f - progress); | |
| 306 return; | |
| 307 } | |
| 308 | |
| 309 SetState(to_state); | |
| 310 } | 316 } |
| 311 | 317 |
| 312 void SetState(HomeCard::State state) { | 318 void SetState(HomeCard::State state) { |
| 313 main_view_->SetVisible(state == HomeCard::VISIBLE_BOTTOM || | |
| 314 state == HomeCard::VISIBLE_CENTERED); | |
| 315 minimized_view_->SetVisible(state == HomeCard::VISIBLE_MINIMIZED); | |
| 316 if (minimized_view_->visible()) | |
| 317 minimized_view_->layer()->SetOpacity(1.0f); | |
| 318 if (state == HomeCard::VISIBLE_CENTERED) | 319 if (state == HomeCard::VISIBLE_CENTERED) |
| 319 main_view_->RequestFocusOnSearchBox(); | 320 main_view_->RequestFocusOnSearchBox(); |
| 320 else | 321 else |
| 321 GetWidget()->GetFocusManager()->ClearFocus(); | 322 GetWidget()->GetFocusManager()->ClearFocus(); |
| 322 wm::SetShadowType(GetWidget()->GetNativeView(), | 323 wm::SetShadowType(GetWidget()->GetNativeView(), |
| 323 state == HomeCard::VISIBLE_MINIMIZED ? | 324 state == HomeCard::VISIBLE_MINIMIZED ? |
| 324 wm::SHADOW_TYPE_NONE : | 325 wm::SHADOW_TYPE_NONE : |
| 325 wm::SHADOW_TYPE_RECTANGULAR); | 326 wm::SHADOW_TYPE_RECTANGULAR); |
| 327 main_view_->SetLayoutState( |
| 328 (state == HomeCard::VISIBLE_CENTERED) ? 1.0f : 0.0f); |
| 326 } | 329 } |
| 327 | 330 |
| 328 void SetStateWithAnimation(HomeCard::State from_state, | 331 void SetStateWithAnimation(HomeCard::State state) { |
| 329 HomeCard::State to_state) { | 332 if (state == HomeCard::VISIBLE_MINIMIZED) |
| 330 if ((from_state == HomeCard::VISIBLE_MINIMIZED && | 333 return; |
| 331 to_state == HomeCard::VISIBLE_BOTTOM) || | 334 |
| 332 (from_state == HomeCard::VISIBLE_BOTTOM && | 335 main_view_->SetLayoutStateWithAnimation( |
| 333 to_state == HomeCard::VISIBLE_MINIMIZED)) { | 336 (state == HomeCard::VISIBLE_CENTERED) ? 1.0f : 0.0f); |
| 334 minimized_view_->SetVisible(true); | |
| 335 main_view_->SetVisible(true); | |
| 336 { | |
| 337 ui::ScopedLayerAnimationSettings settings( | |
| 338 minimized_view_->layer()->GetAnimator()); | |
| 339 settings.SetTweenType(gfx::Tween::EASE_IN_OUT); | |
| 340 settings.AddObserver(new ui::ClosureAnimationObserver( | |
| 341 base::Bind(&HomeCardView::SetState, | |
| 342 weak_factory_.GetWeakPtr(), | |
| 343 to_state))); | |
| 344 minimized_view_->layer()->SetOpacity( | |
| 345 (to_state == HomeCard::VISIBLE_MINIMIZED) ? 1.0f : 0.0f); | |
| 346 } | |
| 347 } else { | |
| 348 // TODO(mukai): Take care of other transition. | |
| 349 SetState(to_state); | |
| 350 } | |
| 351 } | 337 } |
| 352 | 338 |
| 353 void ClearGesture() { | 339 void ClearGesture() { |
| 354 gesture_manager_.reset(); | 340 gesture_manager_.reset(); |
| 355 } | 341 } |
| 356 | 342 |
| 357 // views::View: | 343 // views::View: |
| 358 virtual void Layout() OVERRIDE { | |
| 359 for (int i = 0; i < child_count(); ++i) { | |
| 360 views::View* child = child_at(i); | |
| 361 if (child->visible()) { | |
| 362 if (child == minimized_view_) { | |
| 363 gfx::Rect minimized_bounds = bounds(); | |
| 364 minimized_bounds.set_y( | |
| 365 minimized_bounds.bottom() - kHomeCardMinimizedHeight); | |
| 366 minimized_bounds.set_height(kHomeCardMinimizedHeight); | |
| 367 child->SetBoundsRect(minimized_bounds); | |
| 368 } else { | |
| 369 child->SetBoundsRect(bounds()); | |
| 370 } | |
| 371 } | |
| 372 } | |
| 373 } | |
| 374 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { | 344 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
| 375 if (!gesture_manager_ && | 345 if (!gesture_manager_ && |
| 376 event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { | 346 event->type() == ui::ET_GESTURE_SCROLL_BEGIN) { |
| 377 gesture_manager_.reset(new HomeCardGestureManager( | 347 gesture_manager_.reset(new HomeCardGestureManager( |
| 378 gesture_delegate_, | 348 gesture_delegate_, |
| 379 GetWidget()->GetNativeWindow()->GetRootWindow()->bounds())); | 349 GetWidget()->GetNativeWindow()->GetRootWindow()->bounds())); |
| 380 } | 350 } |
| 381 | 351 |
| 382 if (gesture_manager_) | 352 if (gesture_manager_) |
| 383 gesture_manager_->ProcessGestureEvent(event); | 353 gesture_manager_->ProcessGestureEvent(event); |
| 384 } | 354 } |
| 355 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { |
| 356 if (HomeCard::Get()->GetState() == HomeCard::VISIBLE_MINIMIZED && |
| 357 event.IsLeftMouseButton() && event.GetClickCount() == 1) { |
| 358 athena::WindowManager::GetInstance()->ToggleOverview(); |
| 359 return true; |
| 360 } |
| 361 return false; |
| 362 } |
| 385 | 363 |
| 386 private: | 364 private: |
| 387 // views::WidgetDelegate: | 365 // views::WidgetDelegate: |
| 388 virtual views::View* GetContentsView() OVERRIDE { | 366 virtual views::View* GetContentsView() OVERRIDE { |
| 389 return this; | 367 return this; |
| 390 } | 368 } |
| 391 | 369 |
| 392 AthenaStartPageView* main_view_; | 370 AthenaStartPageView* main_view_; |
| 393 views::View* minimized_view_; | |
| 394 scoped_ptr<HomeCardGestureManager> gesture_manager_; | 371 scoped_ptr<HomeCardGestureManager> gesture_manager_; |
| 395 HomeCardGestureManager::Delegate* gesture_delegate_; | 372 HomeCardGestureManager::Delegate* gesture_delegate_; |
| 396 base::WeakPtrFactory<HomeCardView> weak_factory_; | |
| 397 | 373 |
| 398 DISALLOW_COPY_AND_ASSIGN(HomeCardView); | 374 DISALLOW_COPY_AND_ASSIGN(HomeCardView); |
| 399 }; | 375 }; |
| 400 | 376 |
| 401 class HomeCardImpl : public HomeCard, | 377 class HomeCardImpl : public HomeCard, |
| 402 public AcceleratorHandler, | 378 public AcceleratorHandler, |
| 403 public HomeCardLayoutManager::Delegate, | 379 public HomeCardLayoutManager::Delegate, |
| 404 public HomeCardGestureManager::Delegate, | 380 public HomeCardGestureManager::Delegate, |
| 405 public WindowManagerObserver, | 381 public WindowManagerObserver, |
| 406 public aura::client::ActivationChangeObserver { | 382 public aura::client::ActivationChangeObserver { |
| 407 public: | 383 public: |
| 408 explicit HomeCardImpl(AppModelBuilder* model_builder); | 384 explicit HomeCardImpl(AppModelBuilder* model_builder); |
| 409 virtual ~HomeCardImpl(); | 385 virtual ~HomeCardImpl(); |
| 410 | 386 |
| 411 void Init(); | 387 void Init(); |
| 412 | 388 |
| 413 private: | 389 private: |
| 414 enum Command { | 390 enum Command { |
| 415 COMMAND_SHOW_HOME_CARD, | 391 COMMAND_SHOW_HOME_CARD, |
| 416 }; | 392 }; |
| 417 void InstallAccelerators(); | 393 void InstallAccelerators(); |
| 394 void UpdateMinimizedHomeBounds(); |
| 418 | 395 |
| 419 // Overridden from HomeCard: | 396 // Overridden from HomeCard: |
| 420 virtual void SetState(State state) OVERRIDE; | 397 virtual void SetState(State state) OVERRIDE; |
| 421 virtual State GetState() OVERRIDE; | 398 virtual State GetState() OVERRIDE; |
| 422 virtual void RegisterSearchProvider( | 399 virtual void RegisterSearchProvider( |
| 423 app_list::SearchProvider* search_provider) OVERRIDE; | 400 app_list::SearchProvider* search_provider) OVERRIDE; |
| 424 virtual void UpdateVirtualKeyboardBounds( | 401 virtual void UpdateVirtualKeyboardBounds( |
| 425 const gfx::Rect& bounds) OVERRIDE; | 402 const gfx::Rect& bounds) OVERRIDE; |
| 426 | 403 |
| 427 // AcceleratorHandler: | 404 // AcceleratorHandler: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 451 | 428 |
| 452 // original_state_ is the state which the home card should go back to after | 429 // original_state_ is the state which the home card should go back to after |
| 453 // the virtual keyboard is hidden. | 430 // the virtual keyboard is hidden. |
| 454 HomeCard::State original_state_; | 431 HomeCard::State original_state_; |
| 455 | 432 |
| 456 views::Widget* home_card_widget_; | 433 views::Widget* home_card_widget_; |
| 457 HomeCardView* home_card_view_; | 434 HomeCardView* home_card_view_; |
| 458 scoped_ptr<AppListViewDelegate> view_delegate_; | 435 scoped_ptr<AppListViewDelegate> view_delegate_; |
| 459 HomeCardLayoutManager* layout_manager_; | 436 HomeCardLayoutManager* layout_manager_; |
| 460 aura::client::ActivationClient* activation_client_; // Not owned | 437 aura::client::ActivationClient* activation_client_; // Not owned |
| 438 scoped_ptr<ui::LayerOwner> minimized_home_; |
| 461 | 439 |
| 462 // Right now HomeCard allows only one search provider. | 440 // Right now HomeCard allows only one search provider. |
| 463 // TODO(mukai): port app-list's SearchController and Mixer. | 441 // TODO(mukai): port app-list's SearchController and Mixer. |
| 464 scoped_ptr<app_list::SearchProvider> search_provider_; | 442 scoped_ptr<app_list::SearchProvider> search_provider_; |
| 465 | 443 |
| 466 DISALLOW_COPY_AND_ASSIGN(HomeCardImpl); | 444 DISALLOW_COPY_AND_ASSIGN(HomeCardImpl); |
| 467 }; | 445 }; |
| 468 | 446 |
| 469 HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder) | 447 HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder) |
| 470 : model_builder_(model_builder), | 448 : model_builder_(model_builder), |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 | 487 |
| 510 home_card_view_ = new HomeCardView(view_delegate_.get(), container, this); | 488 home_card_view_ = new HomeCardView(view_delegate_.get(), container, this); |
| 511 home_card_widget_ = new views::Widget(); | 489 home_card_widget_ = new views::Widget(); |
| 512 views::Widget::InitParams widget_params( | 490 views::Widget::InitParams widget_params( |
| 513 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 491 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
| 514 widget_params.parent = container; | 492 widget_params.parent = container; |
| 515 widget_params.delegate = home_card_view_; | 493 widget_params.delegate = home_card_view_; |
| 516 widget_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 494 widget_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| 517 home_card_widget_->Init(widget_params); | 495 home_card_widget_->Init(widget_params); |
| 518 | 496 |
| 497 minimized_home_ = CreateMinimizedHome(); |
| 498 container->layer()->Add(minimized_home_->layer()); |
| 499 container->layer()->StackAtTop(minimized_home_->layer()); |
| 500 layout_manager_->SetMinimizedLayer(minimized_home_->layer()); |
| 501 |
| 519 SetState(VISIBLE_MINIMIZED); | 502 SetState(VISIBLE_MINIMIZED); |
| 520 home_card_view_->Layout(); | 503 home_card_view_->Layout(); |
| 521 | 504 |
| 522 activation_client_ = | 505 activation_client_ = |
| 523 aura::client::GetActivationClient(container->GetRootWindow()); | 506 aura::client::GetActivationClient(container->GetRootWindow()); |
| 524 if (activation_client_) | 507 if (activation_client_) |
| 525 activation_client_->AddObserver(this); | 508 activation_client_->AddObserver(this); |
| 526 | 509 |
| 527 int work_area_bottom_inset = | |
| 528 GetBoundsForState(GetNativeWindow()->bounds(), | |
| 529 HomeCard::VISIBLE_MINIMIZED).height(); | |
| 530 AthenaEnv::Get()->SetDisplayWorkAreaInsets( | 510 AthenaEnv::Get()->SetDisplayWorkAreaInsets( |
| 531 gfx::Insets(0, 0, work_area_bottom_inset, 0)); | 511 gfx::Insets(0, 0, kHomeCardMinimizedHeight, 0)); |
| 532 } | 512 } |
| 533 | 513 |
| 534 void HomeCardImpl::InstallAccelerators() { | 514 void HomeCardImpl::InstallAccelerators() { |
| 535 const AcceleratorData accelerator_data[] = { | 515 const AcceleratorData accelerator_data[] = { |
| 536 {TRIGGER_ON_PRESS, ui::VKEY_L, ui::EF_CONTROL_DOWN, | 516 {TRIGGER_ON_PRESS, ui::VKEY_L, ui::EF_CONTROL_DOWN, |
| 537 COMMAND_SHOW_HOME_CARD, AF_NONE}, | 517 COMMAND_SHOW_HOME_CARD, AF_NONE}, |
| 538 }; | 518 }; |
| 539 AcceleratorManager::Get()->RegisterAccelerators( | 519 AcceleratorManager::Get()->RegisterAccelerators( |
| 540 accelerator_data, arraysize(accelerator_data), this); | 520 accelerator_data, arraysize(accelerator_data), this); |
| 541 } | 521 } |
| 542 | 522 |
| 543 void HomeCardImpl::SetState(HomeCard::State state) { | 523 void HomeCardImpl::SetState(HomeCard::State state) { |
| 544 if (state_ == state) | 524 if (state_ == state) |
| 545 return; | 525 return; |
| 546 | 526 |
| 547 // Update |state_| before changing the visibility of the widgets, so that | 527 // Update |state_| before changing the visibility of the widgets, so that |
| 548 // LayoutManager callbacks get the correct state. | 528 // LayoutManager callbacks get the correct state. |
| 549 HomeCard::State old_state = state_; | 529 HomeCard::State old_state = state_; |
| 550 state_ = state; | 530 state_ = state; |
| 551 original_state_ = state; | 531 original_state_ = state; |
| 532 |
| 533 if (old_state == VISIBLE_MINIMIZED || |
| 534 state_ == VISIBLE_MINIMIZED) { |
| 535 minimized_home_->layer()->SetVisible(true); |
| 536 { |
| 537 ui::ScopedLayerAnimationSettings settings( |
| 538 minimized_home_->layer()->GetAnimator()); |
| 539 minimized_home_->layer()->SetVisible(state_ == VISIBLE_MINIMIZED); |
| 540 minimized_home_->layer()->SetOpacity( |
| 541 state_ == VISIBLE_MINIMIZED ? 1.0f : 0.0f); |
| 542 } |
| 543 } |
| 552 if (state_ == HIDDEN) { | 544 if (state_ == HIDDEN) { |
| 553 home_card_widget_->Hide(); | 545 home_card_widget_->Hide(); |
| 554 } else { | 546 } else { |
| 555 if (state_ == VISIBLE_CENTERED) | 547 if (state_ == VISIBLE_CENTERED) |
| 556 home_card_widget_->Show(); | 548 home_card_widget_->Show(); |
| 557 else | 549 else |
| 558 home_card_widget_->ShowInactive(); | 550 home_card_widget_->ShowInactive(); |
| 559 home_card_view_->SetStateWithAnimation(old_state, state); | 551 home_card_view_->SetStateWithAnimation(state); |
| 560 layout_manager_->Layout(); | 552 layout_manager_->Layout(true); |
| 561 } | 553 } |
| 562 } | 554 } |
| 563 | 555 |
| 564 HomeCard::State HomeCardImpl::GetState() { | 556 HomeCard::State HomeCardImpl::GetState() { |
| 565 return state_; | 557 return state_; |
| 566 } | 558 } |
| 567 | 559 |
| 568 void HomeCardImpl::RegisterSearchProvider( | 560 void HomeCardImpl::RegisterSearchProvider( |
| 569 app_list::SearchProvider* search_provider) { | 561 app_list::SearchProvider* search_provider) { |
| 570 DCHECK(!search_provider_); | 562 DCHECK(!search_provider_); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 | 594 |
| 603 return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL; | 595 return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL; |
| 604 } | 596 } |
| 605 | 597 |
| 606 void HomeCardImpl::OnGestureEnded(State final_state) { | 598 void HomeCardImpl::OnGestureEnded(State final_state) { |
| 607 home_card_view_->ClearGesture(); | 599 home_card_view_->ClearGesture(); |
| 608 if (state_ != final_state && | 600 if (state_ != final_state && |
| 609 (state_ == VISIBLE_MINIMIZED || final_state == VISIBLE_MINIMIZED)) { | 601 (state_ == VISIBLE_MINIMIZED || final_state == VISIBLE_MINIMIZED)) { |
| 610 WindowManager::GetInstance()->ToggleOverview(); | 602 WindowManager::GetInstance()->ToggleOverview(); |
| 611 } else { | 603 } else { |
| 612 HomeCard::State old_state = state_; | |
| 613 state_ = final_state; | 604 state_ = final_state; |
| 614 home_card_view_->SetStateWithAnimation(old_state, final_state); | 605 home_card_view_->SetStateWithAnimation(state_); |
| 615 layout_manager_->Layout(); | 606 layout_manager_->Layout(true); |
| 616 } | 607 } |
| 617 } | 608 } |
| 618 | 609 |
| 619 void HomeCardImpl::OnGestureProgressed( | 610 void HomeCardImpl::OnGestureProgressed( |
| 620 State from_state, State to_state, float progress) { | 611 State from_state, State to_state, float progress) { |
| 621 home_card_view_->SetStateProgress(from_state, to_state, progress); | 612 if (from_state == VISIBLE_MINIMIZED || to_state == VISIBLE_MINIMIZED) { |
| 622 | 613 minimized_home_->layer()->SetVisible(true); |
| 614 float opacity = |
| 615 (from_state == VISIBLE_MINIMIZED) ? 1.0f - progress : progress; |
| 616 minimized_home_->layer()->SetOpacity(opacity); |
| 617 } |
| 623 gfx::Rect screen_bounds = | 618 gfx::Rect screen_bounds = |
| 624 home_card_widget_->GetNativeWindow()->GetRootWindow()->bounds(); | 619 home_card_widget_->GetNativeWindow()->GetRootWindow()->bounds(); |
| 625 home_card_widget_->SetBounds(gfx::Tween::RectValueBetween( | 620 home_card_widget_->SetBounds(gfx::Tween::RectValueBetween( |
| 626 progress, | 621 progress, |
| 627 GetBoundsForState(screen_bounds, from_state), | 622 GetBoundsForState(screen_bounds, from_state), |
| 628 GetBoundsForState(screen_bounds, to_state))); | 623 GetBoundsForState(screen_bounds, to_state))); |
| 629 | 624 |
| 625 home_card_view_->SetStateProgress(from_state, to_state, progress); |
| 626 |
| 630 // TODO(mukai): signals the update to the window manager so that it shows the | 627 // TODO(mukai): signals the update to the window manager so that it shows the |
| 631 // intermediate visual state of overview mode. | 628 // intermediate visual state of overview mode. |
| 632 } | 629 } |
| 633 | 630 |
| 634 void HomeCardImpl::OnOverviewModeEnter() { | 631 void HomeCardImpl::OnOverviewModeEnter() { |
| 635 SetState(VISIBLE_BOTTOM); | 632 SetState(VISIBLE_BOTTOM); |
| 636 } | 633 } |
| 637 | 634 |
| 638 void HomeCardImpl::OnOverviewModeExit() { | 635 void HomeCardImpl::OnOverviewModeExit() { |
| 639 SetState(VISIBLE_MINIMIZED); | 636 SetState(VISIBLE_MINIMIZED); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 663 instance = NULL; | 660 instance = NULL; |
| 664 } | 661 } |
| 665 | 662 |
| 666 // static | 663 // static |
| 667 HomeCard* HomeCard::Get() { | 664 HomeCard* HomeCard::Get() { |
| 668 DCHECK(instance); | 665 DCHECK(instance); |
| 669 return instance; | 666 return instance; |
| 670 } | 667 } |
| 671 | 668 |
| 672 } // namespace athena | 669 } // namespace athena |
| OLD | NEW |