1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/home/home_card_impl.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <cmath>
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <limits>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/env/public/athena_env.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "athena/home/app_list_view_delegate.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/home/athena_start_page_view.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/home/home_card_constants.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "athena/home/minimized_home.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "athena/home/public/app_model_builder.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "athena/screen/public/screen_manager.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/util/container_priorities.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "athena/wm/public/window_manager.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/search_provider.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/app_list/views/app_list_main_view.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/app_list/views/contents_view.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/layout_manager.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/aura/window.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/compositor/layer.h"
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/animation/tween.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/layout/fill_layout.h"
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/widget/widget.h"
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h"
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/wm/core/shadow_types.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/visibility_controller.h"
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/wm/public/activation_client.h"
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace athena {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HomeCard* instance = NULL;
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)gfx::Rect GetBoundsForState(const gfx::Rect& screen_bounds,
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            HomeCard::State state) {
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  switch (state) {
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case HomeCard::HIDDEN:
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      break;
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case HomeCard::VISIBLE_CENTERED:
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return screen_bounds;
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Do not change the home_card's size, only changes the top position
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // instead, because size change causes unnecessary re-layouts.
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case HomeCard::VISIBLE_BOTTOM:
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return gfx::Rect(0,
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       screen_bounds.bottom() - kHomeCardHeight,
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       screen_bounds.width(),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       screen_bounds.height());
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case HomeCard::VISIBLE_MINIMIZED:
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return gfx::Rect(0,
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       screen_bounds.bottom() - kHomeCardMinimizedHeight,
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       screen_bounds.width(),
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       screen_bounds.height());
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  NOTREACHED();
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return gfx::Rect();
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Makes sure the homecard is center-aligned horizontally and bottom-aligned
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// vertically.
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class HomeCardLayoutManager : public aura::LayoutManager {
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  HomeCardLayoutManager()
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : home_card_(NULL),
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        minimized_layer_(NULL) {}
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~HomeCardLayoutManager() {}
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Layout(bool animate, gfx::Tween::Type tween_type) {
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // |home_card| could be detached from the root window (e.g. when it is being
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // destroyed).
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!home_card_ || !home_card_->IsVisible() || !home_card_->GetRootWindow())
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return;
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<ui::ScopedLayerAnimationSettings> settings;
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (animate) {
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      settings.reset(new ui::ScopedLayerAnimationSettings(
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          home_card_->layer()->GetAnimator()));
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      settings->SetTweenType(tween_type);
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetChildBoundsDirect(home_card_, GetBoundsForState(
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        home_card_->GetRootWindow()->bounds(), HomeCard::Get()->GetState()));
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetMinimizedLayer(ui::Layer* minimized_layer) {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_layer_ = minimized_layer;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateMinimizedHomeBounds();
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UpdateMinimizedHomeBounds() {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect minimized_bounds = minimized_layer_->parent()->bounds();
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_bounds.set_y(
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        minimized_bounds.bottom() - kHomeCardMinimizedHeight);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_bounds.set_height(kHomeCardMinimizedHeight);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_layer_->SetBounds(minimized_bounds);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // aura::LayoutManager:
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnWindowResized() OVERRIDE {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Layout(false, gfx::Tween::LINEAR);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateMinimizedHomeBounds();
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!home_card_) {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      home_card_ = child;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Layout(false, gfx::Tween::LINEAR);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (home_card_ == child)
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      home_card_ = NULL;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnChildWindowVisibilityChanged(aura::Window* child,
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                              bool visible) OVERRIDE {
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (home_card_ == child)
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Layout(false, gfx::Tween::LINEAR);
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetChildBounds(aura::Window* child,
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              const gfx::Rect& requested_bounds) OVERRIDE {
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetChildBoundsDirect(child, requested_bounds);
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  aura::Window* home_card_;
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::Layer* minimized_layer_;
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HomeCardLayoutManager);
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The container view of home card contents of each state.
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class HomeCardView : public views::WidgetDelegateView {
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HomeCardView(app_list::AppListViewDelegate* view_delegate,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               aura::Window* container,
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               HomeCardGestureManager::Delegate* gesture_delegate)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : gesture_delegate_(gesture_delegate) {
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetLayoutManager(new views::FillLayout());
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // Ideally AppListMainView should be used here and have AthenaStartPageView
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // as its child view, so that custom pages and apps grid are available in
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // the home card.
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // TODO(mukai): make it so after the detailed UI has been fixed.
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    main_view_ = new AthenaStartPageView(view_delegate);
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AddChildView(main_view_);
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetStateProgress(HomeCard::State from_state,
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        HomeCard::State to_state,
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        float progress) {
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(mukai): not clear the focus, but simply close the virtual keyboard.
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetFocusManager()->ClearFocus();
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (from_state == HomeCard::VISIBLE_CENTERED)
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      main_view_->SetLayoutState(1.0f - progress);
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else if (to_state == HomeCard::VISIBLE_CENTERED)
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      main_view_->SetLayoutState(progress);
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateShadow(true);
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetStateWithAnimation(HomeCard::State state,
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             gfx::Tween::Type tween_type) {
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    UpdateShadow(state != HomeCard::VISIBLE_MINIMIZED);
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (state == HomeCard::VISIBLE_CENTERED)
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      main_view_->RequestFocusOnSearchBox();
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      GetWidget()->GetFocusManager()->ClearFocus();
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    main_view_->SetLayoutStateWithAnimation(
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (state == HomeCard::VISIBLE_CENTERED) ? 1.0f : 0.0f, tween_type);
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void ClearGesture() {
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gesture_manager_.reset();
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // views::View:
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (!gesture_manager_ &&
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        event->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      gesture_manager_.reset(new HomeCardGestureManager(
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          gesture_delegate_,
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          GetWidget()->GetNativeWindow()->GetRootWindow()->bounds()));
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (gesture_manager_)
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      gesture_manager_->ProcessGestureEvent(event);
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (HomeCard::Get()->GetState() == HomeCard::VISIBLE_MINIMIZED &&
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        event.IsLeftMouseButton() && event.GetClickCount() == 1) {
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      athena::WindowManager::Get()->ToggleOverview();
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return true;
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UpdateShadow(bool should_show) {
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wm::SetShadowType(
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetWidget()->GetNativeWindow(),
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        should_show ? wm::SHADOW_TYPE_RECTANGULAR : wm::SHADOW_TYPE_NONE);
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // views::WidgetDelegate:
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual views::View* GetContentsView() OVERRIDE {
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return this;
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  AthenaStartPageView* main_view_;
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<HomeCardGestureManager> gesture_manager_;
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  HomeCardGestureManager::Delegate* gesture_delegate_;
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HomeCardView);
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HomeCardImpl::HomeCardImpl(AppModelBuilder* model_builder)
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : model_builder_(model_builder),
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      state_(HIDDEN),
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      original_state_(VISIBLE_MINIMIZED),
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      home_card_widget_(NULL),
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      home_card_view_(NULL),
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      layout_manager_(NULL),
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      activation_client_(NULL) {
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!instance);
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  instance = this;
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowManager::Get()->AddObserver(this);
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HomeCardImpl::~HomeCardImpl() {
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(instance);
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WindowManager::Get()->RemoveObserver(this);
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (activation_client_)
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    activation_client_->RemoveObserver(this);
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  home_card_widget_->CloseNow();
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Reset the view delegate first as it access search provider during
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // shutdown.
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  view_delegate_.reset();
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  search_provider_.reset();
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  instance = NULL;
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::Init() {
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  InstallAccelerators();
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ScreenManager::ContainerParams params("HomeCardContainer", CP_HOME_CARD);
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  params.can_activate_children = true;
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  aura::Window* container = ScreenManager::Get()->CreateContainer(params);
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layout_manager_ = new HomeCardLayoutManager();
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  container->SetLayoutManager(layout_manager_);
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  wm::SetChildWindowVisibilityChangesAnimated(container);
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  view_delegate_.reset(new AppListViewDelegate(model_builder_.get()));
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (search_provider_)
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    view_delegate_->RegisterSearchProvider(search_provider_.get());
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_view_ = new HomeCardView(view_delegate_.get(), container, this);
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_widget_ = new views::Widget();
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  views::Widget::InitParams widget_params(
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  widget_params.parent = container;
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  widget_params.delegate = home_card_view_;
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  widget_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_widget_->Init(widget_params);
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  minimized_home_ = CreateMinimizedHome();
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  container->layer()->Add(minimized_home_->layer());
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  container->layer()->StackAtTop(minimized_home_->layer());
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  layout_manager_->SetMinimizedLayer(minimized_home_->layer());
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetState(VISIBLE_MINIMIZED);
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_view_->Layout();
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  activation_client_ =
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      aura::client::GetActivationClient(container->GetRootWindow());
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (activation_client_)
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    activation_client_->AddObserver(this);
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AthenaEnv::Get()->SetDisplayWorkAreaInsets(
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gfx::Insets(0, 0, kHomeCardMinimizedHeight, 0));
2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciaura::Window* HomeCardImpl::GetHomeCardWindowForTest() const {
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return home_card_widget_ ? home_card_widget_->GetNativeWindow() : NULL;
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::InstallAccelerators() {
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const AcceleratorData accelerator_data[] = {
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      {TRIGGER_ON_PRESS, ui::VKEY_L, ui::EF_CONTROL_DOWN,
2996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       COMMAND_SHOW_HOME_CARD, AF_NONE},
3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  AcceleratorManager::Get()->RegisterAccelerators(
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      accelerator_data, arraysize(accelerator_data), this);
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HomeCardImpl::SetState(HomeCard::State state) {
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (state_ == state)
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Update |state_| before changing the visibility of the widgets, so that
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // LayoutManager callbacks get the correct state.
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  HomeCard::State old_state = state_;
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  state_ = state;
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  original_state_ = state;
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (old_state == VISIBLE_MINIMIZED ||
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      state_ == VISIBLE_MINIMIZED) {
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_home_->layer()->SetVisible(true);
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::ScopedLayerAnimationSettings settings(
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          minimized_home_->layer()->GetAnimator());
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      minimized_home_->layer()->SetVisible(state_ == VISIBLE_MINIMIZED);
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      minimized_home_->layer()->SetOpacity(
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          state_ == VISIBLE_MINIMIZED ? 1.0f : 0.0f);
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (state_ == HIDDEN) {
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    home_card_widget_->Hide();
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else {
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (state_ == VISIBLE_MINIMIZED)
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      home_card_widget_->ShowInactive();
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    else
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      home_card_widget_->Show();
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    home_card_view_->SetStateWithAnimation(state, gfx::Tween::EASE_IN_OUT);
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    layout_manager_->Layout(true, gfx::Tween::EASE_IN_OUT);
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)HomeCard::State HomeCardImpl::GetState() {
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return state_;
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HomeCardImpl::RegisterSearchProvider(
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    app_list::SearchProvider* search_provider) {
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(!search_provider_);
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  search_provider_.reset(search_provider);
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  view_delegate_->RegisterSearchProvider(search_provider_.get());
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HomeCardImpl::UpdateVirtualKeyboardBounds(
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const gfx::Rect& bounds) {
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (state_ == VISIBLE_MINIMIZED && !bounds.IsEmpty()) {
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SetState(HIDDEN);
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    original_state_ = VISIBLE_MINIMIZED;
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else if (state_ == VISIBLE_BOTTOM && !bounds.IsEmpty()) {
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SetState(VISIBLE_CENTERED);
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    original_state_ = VISIBLE_BOTTOM;
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  } else if (state_ != original_state_ && bounds.IsEmpty()) {
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SetState(original_state_);
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool HomeCardImpl::IsCommandEnabled(int command_id) const {
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool HomeCardImpl::OnAcceleratorFired(int command_id,
3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      const ui::Accelerator& accelerator) {
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK_EQ(COMMAND_SHOW_HOME_CARD, command_id);
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (state_ == VISIBLE_CENTERED && original_state_ != VISIBLE_BOTTOM)
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetState(VISIBLE_MINIMIZED);
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  else if (state_ == VISIBLE_MINIMIZED)
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetState(VISIBLE_CENTERED);
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HomeCardImpl::OnGestureEnded(State final_state, bool is_fling) {
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_view_->ClearGesture();
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (state_ != final_state &&
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (state_ == VISIBLE_MINIMIZED || final_state == VISIBLE_MINIMIZED)) {
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetState(final_state);
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WindowManager::Get()->ToggleOverview();
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else {
3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    state_ = final_state;
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // When the animation happens after a fling, EASE_IN_OUT would cause weird
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // slow-down right after the finger release because of slow-in. Therefore
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // EASE_OUT is better.
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Tween::Type tween_type =
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        is_fling ? gfx::Tween::EASE_OUT : gfx::Tween::EASE_IN_OUT;
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    home_card_view_->SetStateWithAnimation(state_, tween_type);
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    layout_manager_->Layout(true, tween_type);
3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::OnGestureProgressed(
3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    State from_state, State to_state, float progress) {
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (from_state == VISIBLE_MINIMIZED || to_state == VISIBLE_MINIMIZED) {
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_home_->layer()->SetVisible(true);
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    float opacity =
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (from_state == VISIBLE_MINIMIZED) ? 1.0f - progress : progress;
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    minimized_home_->layer()->SetOpacity(opacity);
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Rect screen_bounds =
4046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      home_card_widget_->GetNativeWindow()->GetRootWindow()->bounds();
4056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  home_card_widget_->SetBounds(gfx::Tween::RectValueBetween(
4066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      progress,
4076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetBoundsForState(screen_bounds, from_state),
4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      GetBoundsForState(screen_bounds, to_state)));
4096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  home_card_view_->SetStateProgress(from_state, to_state, progress);
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(mukai): signals the update to the window manager so that it shows the
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // intermediate visual state of overview mode.
41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::OnOverviewModeEnter() {
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (state_ == HIDDEN || state_ == VISIBLE_MINIMIZED)
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SetState(VISIBLE_BOTTOM);
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::OnOverviewModeExit() {
4226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SetState(VISIBLE_MINIMIZED);
4236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HomeCardImpl::OnSplitViewModeEnter() {
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid HomeCardImpl::OnSplitViewModeExit() {
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void HomeCardImpl::OnWindowActivated(aura::Window* gained_active,
4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     aura::Window* lost_active) {
4336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (state_ != HIDDEN &&
4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      gained_active != home_card_widget_->GetNativeWindow()) {
4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetState(VISIBLE_MINIMIZED);
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
440f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HomeCard* HomeCard::Create(AppModelBuilder* model_builder) {
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  (new HomeCardImpl(model_builder))->Init();
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(instance);
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return instance;
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HomeCard::Shutdown() {
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(instance);
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delete instance;
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  instance = NULL;
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)HomeCard* HomeCard::Get() {
455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(instance);
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return instance;
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace athena
460