Index: athena/home/home_card_impl.cc |
diff --git a/athena/home/home_card_impl.cc b/athena/home/home_card_impl.cc |
index 9c993f2c413a80fe3a3dc3d3450a5ce932381b02..0e45acaeb139ca52752ec89758d6cea2ad2e40ff 100644 |
--- a/athena/home/home_card_impl.cc |
+++ b/athena/home/home_card_impl.cc |
@@ -17,11 +17,14 @@ |
#include "athena/wm/public/window_manager.h" |
#include "athena/wm/public/window_manager_observer.h" |
#include "base/bind.h" |
+#include "base/memory/weak_ptr.h" |
#include "ui/app_list/search_provider.h" |
#include "ui/app_list/views/app_list_main_view.h" |
#include "ui/app_list/views/contents_view.h" |
#include "ui/aura/layout_manager.h" |
#include "ui/aura/window.h" |
+#include "ui/compositor/closure_animation_observer.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/views/background.h" |
#include "ui/views/layout/box_layout.h" |
#include "ui/views/widget/widget.h" |
@@ -88,8 +91,13 @@ class HomeCardLayoutManager : public aura::LayoutManager { |
if (!home_card || !home_card->GetRootWindow()) |
return; |
- SetChildBoundsDirect(home_card, GetBoundsForState( |
- home_card->GetRootWindow()->bounds(), delegate_->GetState())); |
+ { |
+ ui::ScopedLayerAnimationSettings settings( |
+ home_card->layer()->GetAnimator()); |
+ settings.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ SetChildBoundsDirect(home_card, GetBoundsForState( |
+ home_card->GetRootWindow()->bounds(), delegate_->GetState())); |
+ } |
} |
private: |
@@ -267,7 +275,8 @@ class HomeCardView : public views::WidgetDelegateView { |
HomeCardView(app_list::AppListViewDelegate* view_delegate, |
aura::Window* container, |
HomeCardGestureManager::Delegate* gesture_delegate) |
- : gesture_delegate_(gesture_delegate) { |
+ : gesture_delegate_(gesture_delegate), |
+ weak_factory_(this) { |
bottom_view_ = new AthenaStartPageView(view_delegate); |
AddChildView(bottom_view_); |
bottom_view_->SetPaintToLayer(true); |
@@ -323,6 +332,31 @@ class HomeCardView : public views::WidgetDelegateView { |
wm::SHADOW_TYPE_RECTANGULAR); |
} |
+ void SetStateWithAnimation(HomeCard::State from_state, |
+ HomeCard::State to_state) { |
+ if ((from_state == HomeCard::VISIBLE_MINIMIZED && |
+ to_state == HomeCard::VISIBLE_BOTTOM) || |
+ (from_state == HomeCard::VISIBLE_BOTTOM && |
+ to_state == HomeCard::VISIBLE_MINIMIZED)) { |
+ minimized_view_->SetVisible(true); |
+ bottom_view_->SetVisible(true); |
+ { |
+ ui::ScopedLayerAnimationSettings settings( |
+ minimized_view_->layer()->GetAnimator()); |
+ settings.SetTweenType(gfx::Tween::EASE_IN_OUT); |
+ settings.AddObserver(new ui::ClosureAnimationObserver( |
+ base::Bind(&HomeCardView::SetState, |
+ weak_factory_.GetWeakPtr(), |
+ to_state))); |
+ minimized_view_->layer()->SetOpacity( |
+ (to_state == HomeCard::VISIBLE_MINIMIZED) ? 1.0f : 0.0f); |
+ } |
+ } else { |
+ // TODO(mukai): Take care of other transition. |
+ SetState(to_state); |
+ } |
+ } |
+ |
void ClearGesture() { |
gesture_manager_.reset(); |
} |
@@ -356,6 +390,7 @@ class HomeCardView : public views::WidgetDelegateView { |
} |
private: |
+ // views::WidgetDelegate: |
virtual views::View* GetContentsView() OVERRIDE { |
return this; |
} |
@@ -365,6 +400,7 @@ class HomeCardView : public views::WidgetDelegateView { |
views::View* minimized_view_; |
scoped_ptr<HomeCardGestureManager> gesture_manager_; |
HomeCardGestureManager::Delegate* gesture_delegate_; |
+ base::WeakPtrFactory<HomeCardView> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(HomeCardView); |
}; |
@@ -506,6 +542,7 @@ void HomeCardImpl::SetState(HomeCard::State state) { |
// Update |state_| before changing the visibility of the widgets, so that |
// LayoutManager callbacks get the correct state. |
+ HomeCard::State old_state = state_; |
state_ = state; |
original_state_ = state; |
if (state_ == HIDDEN) { |
@@ -515,7 +552,7 @@ void HomeCardImpl::SetState(HomeCard::State state) { |
home_card_widget_->Show(); |
else |
home_card_widget_->ShowInactive(); |
- home_card_view_->SetState(state); |
+ home_card_view_->SetStateWithAnimation(old_state, state); |
layout_manager_->Layout(); |
} |
} |
@@ -568,8 +605,9 @@ void HomeCardImpl::OnGestureEnded(State final_state) { |
(state_ == VISIBLE_MINIMIZED || final_state == VISIBLE_MINIMIZED)) { |
WindowManager::GetInstance()->ToggleOverview(); |
} else { |
+ HomeCard::State old_state = state_; |
state_ = final_state; |
- home_card_view_->SetState(final_state); |
+ home_card_view_->SetStateWithAnimation(old_state, final_state); |
layout_manager_->Layout(); |
} |
} |