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