Chromium Code Reviews| 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/home_card_impl.h" | 5 #include "athena/home/home_card_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "athena/env/public/athena_env.h" | 10 #include "athena/env/public/athena_env.h" |
| 11 #include "athena/home/app_list_view_delegate.h" | 11 #include "athena/home/app_list_view_delegate.h" |
| 12 #include "athena/home/athena_start_page_view.h" | 12 #include "athena/home/athena_start_page_view.h" |
| 13 #include "athena/home/home_card_constants.h" | 13 #include "athena/home/home_card_constants.h" |
| 14 #include "athena/home/public/app_model_builder.h" | 14 #include "athena/home/public/app_model_builder.h" |
| 15 #include "athena/screen/public/screen_manager.h" | 15 #include "athena/screen/public/screen_manager.h" |
| 16 #include "athena/util/container_priorities.h" | 16 #include "athena/util/container_priorities.h" |
| 17 #include "athena/wm/public/window_manager.h" | 17 #include "athena/wm/public/window_manager.h" |
| 18 #include "ui/app_list/views/app_list_main_view.h" | 18 #include "ui/app_list/views/app_list_main_view.h" |
| 19 #include "ui/app_list/views/contents_view.h" | 19 #include "ui/app_list/views/contents_view.h" |
| 20 #include "ui/aura/layout_manager.h" | 20 #include "ui/aura/layout_manager.h" |
| 21 #include "ui/aura/window.h" | 21 #include "ui/aura/window.h" |
| 22 #include "ui/compositor/closure_animation_observer.h" | |
| 22 #include "ui/compositor/layer.h" | 23 #include "ui/compositor/layer.h" |
| 23 #include "ui/compositor/scoped_layer_animation_settings.h" | 24 #include "ui/compositor/scoped_layer_animation_settings.h" |
| 24 #include "ui/gfx/animation/tween.h" | 25 #include "ui/gfx/animation/tween.h" |
| 25 #include "ui/views/background.h" | 26 #include "ui/views/background.h" |
| 26 #include "ui/views/layout/fill_layout.h" | 27 #include "ui/views/layout/fill_layout.h" |
| 27 #include "ui/views/widget/widget.h" | 28 #include "ui/views/widget/widget.h" |
| 28 #include "ui/views/widget/widget_delegate.h" | 29 #include "ui/views/widget/widget_delegate.h" |
| 29 #include "ui/wm/core/shadow_types.h" | 30 #include "ui/wm/core/shadow_types.h" |
| 30 #include "ui/wm/core/visibility_controller.h" | 31 #include "ui/wm/core/visibility_controller.h" |
| 31 | 32 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 class HomeCardView : public views::WidgetDelegateView, | 125 class HomeCardView : public views::WidgetDelegateView, |
| 125 public AthenaStartPageView::Observer { | 126 public AthenaStartPageView::Observer { |
| 126 public: | 127 public: |
| 127 HomeCardView(app_list::AppListViewDelegate* view_delegate, | 128 HomeCardView(app_list::AppListViewDelegate* view_delegate, |
| 128 aura::Window* container, | 129 aura::Window* container, |
| 129 HomeCardGestureManager::Delegate* gesture_delegate) | 130 HomeCardGestureManager::Delegate* gesture_delegate) |
| 130 : background_(new views::View), | 131 : background_(new views::View), |
| 131 main_view_(new AthenaStartPageView(view_delegate)), | 132 main_view_(new AthenaStartPageView(view_delegate)), |
| 132 minimized_background_(new views::View()), | 133 minimized_background_(new views::View()), |
| 133 drag_indicator_(new views::View()), | 134 drag_indicator_(new views::View()), |
| 134 gesture_delegate_(gesture_delegate) { | 135 gesture_delegate_(gesture_delegate), |
| 136 weak_factory_(this) { | |
| 135 background_->set_background( | 137 background_->set_background( |
| 136 views::Background::CreateVerticalGradientBackground(SK_ColorLTGRAY, | 138 views::Background::CreateVerticalGradientBackground(SK_ColorLTGRAY, |
| 137 SK_ColorWHITE)); | 139 SK_ColorWHITE)); |
| 138 background_->SetPaintToLayer(true); | 140 background_->SetPaintToLayer(true); |
| 139 background_->SetFillsBoundsOpaquely(false); | 141 background_->SetFillsBoundsOpaquely(false); |
| 140 AddChildView(background_); | 142 AddChildView(background_); |
| 141 | 143 |
| 142 // Ideally AppListMainView should be used here and have AthenaStartPageView | 144 // Ideally AppListMainView should be used here and have AthenaStartPageView |
| 143 // as its child view, so that custom pages and apps grid are available in | 145 // as its child view, so that custom pages and apps grid are available in |
| 144 // the home card. | 146 // the home card. |
| 145 // TODO(mukai): make it so after the detailed UI has been fixed. | 147 // TODO(mukai): make it so after the detailed UI has been fixed. |
| 146 main_view_->AddObserver(this); | 148 main_view_->AddObserver(this); |
| 147 AddChildView(main_view_); | 149 AddChildView(main_view_); |
| 148 | 150 |
| 149 minimized_background_->set_background( | 151 minimized_background_->set_background( |
| 150 views::Background::CreateSolidBackground( | 152 views::Background::CreateSolidBackground( |
| 151 SkColorSetA(SK_ColorBLACK, 256 * kMinimizedHomeOpacity))); | 153 SkColorSetA(SK_ColorBLACK, 256 * kMinimizedHomeOpacity))); |
| 152 minimized_background_->SetPaintToLayer(true); | 154 minimized_background_->SetPaintToLayer(true); |
| 153 minimized_background_->SetFillsBoundsOpaquely(false); | 155 minimized_background_->SetFillsBoundsOpaquely(false); |
| 154 minimized_background_->layer()->set_name("MinimizedBackground"); | 156 minimized_background_->layer()->set_name("MinimizedBackground"); |
| 155 AddChildView(minimized_background_); | 157 AddChildView(minimized_background_); |
|
yoshiki
2014/11/04 06:49:29
Just out of curiosity, why do you add the minimize
| |
| 156 | 158 |
| 157 drag_indicator_->set_background( | 159 drag_indicator_->set_background( |
| 158 views::Background::CreateSolidBackground(SK_ColorWHITE)); | 160 views::Background::CreateSolidBackground(SK_ColorWHITE)); |
| 159 drag_indicator_->SetPaintToLayer(true); | 161 drag_indicator_->SetPaintToLayer(true); |
| 160 AddChildView(drag_indicator_); | 162 AddChildView(drag_indicator_); |
| 161 } | 163 } |
| 162 | 164 |
| 163 ~HomeCardView() override { main_view_->RemoveObserver(this); } | 165 ~HomeCardView() override { main_view_->RemoveObserver(this); } |
| 164 | 166 |
| 165 void SetStateProgress(HomeCard::State from_state, | 167 void SetStateProgress(HomeCard::State from_state, |
| 166 HomeCard::State to_state, | 168 HomeCard::State to_state, |
| 167 float progress) { | 169 float progress) { |
| 168 // TODO(mukai): not clear the focus, but simply close the virtual keyboard. | 170 // TODO(mukai): not clear the focus, but simply close the virtual keyboard. |
| 169 GetFocusManager()->ClearFocus(); | 171 GetFocusManager()->ClearFocus(); |
| 170 if (from_state == HomeCard::VISIBLE_CENTERED) | 172 if (from_state == HomeCard::VISIBLE_CENTERED) |
| 171 main_view_->SetLayoutState(1.0f - progress); | 173 main_view_->SetLayoutState(1.0f - progress); |
| 172 else if (to_state == HomeCard::VISIBLE_CENTERED) | 174 else if (to_state == HomeCard::VISIBLE_CENTERED) |
| 173 main_view_->SetLayoutState(progress); | 175 main_view_->SetLayoutState(progress); |
| 174 | 176 |
| 175 float background_opacity = 1.0f; | 177 float background_opacity = 1.0f; |
| 176 if (from_state == HomeCard::VISIBLE_MINIMIZED || | 178 if (from_state == HomeCard::VISIBLE_MINIMIZED || |
| 177 to_state == HomeCard::VISIBLE_MINIMIZED) { | 179 to_state == HomeCard::VISIBLE_MINIMIZED) { |
| 178 background_opacity = (from_state == HomeCard::VISIBLE_MINIMIZED) | 180 background_opacity = (from_state == HomeCard::VISIBLE_MINIMIZED) |
| 179 ? progress | 181 ? progress |
| 180 : (1.0f - progress); | 182 : (1.0f - progress); |
| 181 } | 183 } |
| 182 background_->layer()->SetOpacity(background_opacity); | 184 background_->layer()->SetOpacity(background_opacity); |
| 183 minimized_background_->layer()->SetOpacity(1.0f - background_opacity); | 185 minimized_background_->layer()->SetOpacity(1.0f - background_opacity); |
| 186 UpdateMinimizedBackgroundVisibility(); | |
| 184 | 187 |
| 185 int background_height = kHomeCardHeight; | 188 int background_height = kHomeCardHeight; |
| 186 if (from_state == HomeCard::VISIBLE_CENTERED || | 189 if (from_state == HomeCard::VISIBLE_CENTERED || |
| 187 to_state == HomeCard::VISIBLE_CENTERED) { | 190 to_state == HomeCard::VISIBLE_CENTERED) { |
| 188 gfx::Rect window_bounds = GetWidget()->GetWindowBoundsInScreen(); | 191 gfx::Rect window_bounds = GetWidget()->GetWindowBoundsInScreen(); |
| 189 background_height = window_bounds.height() - window_bounds.y(); | 192 background_height = window_bounds.height() - window_bounds.y(); |
| 190 } | 193 } |
| 191 gfx::Transform background_transform; | 194 gfx::Transform background_transform; |
| 192 background_transform.Scale( | 195 background_transform.Scale( |
| 193 SK_MScalar1, | 196 SK_MScalar1, |
| 194 SkIntToMScalar(background_height) / SkIntToMScalar(height())); | 197 SkIntToMScalar(background_height) / SkIntToMScalar(height())); |
| 195 background_->layer()->SetTransform(background_transform); | 198 background_->layer()->SetTransform(background_transform); |
| 196 | 199 |
| 197 gfx::Rect from_bounds = GetDragIndicatorBounds(from_state); | 200 gfx::Rect from_bounds = GetDragIndicatorBounds(from_state); |
| 198 gfx::Rect to_bounds = GetDragIndicatorBounds(to_state); | 201 gfx::Rect to_bounds = GetDragIndicatorBounds(to_state); |
| 199 if (from_bounds != to_bounds) { | 202 if (from_bounds != to_bounds) { |
| 200 DCHECK_EQ(from_bounds.size().ToString(), to_bounds.size().ToString()); | 203 DCHECK_EQ(from_bounds.size().ToString(), to_bounds.size().ToString()); |
| 201 drag_indicator_->SetBoundsRect( | 204 drag_indicator_->SetBoundsRect( |
| 202 gfx::Tween::RectValueBetween(progress, from_bounds, to_bounds)); | 205 gfx::Tween::RectValueBetween(progress, from_bounds, to_bounds)); |
| 203 } | 206 } |
| 204 } | 207 } |
| 205 | 208 |
| 206 void SetStateWithAnimation(HomeCard::State state, | 209 void SetStateWithAnimation(HomeCard::State state, |
| 207 gfx::Tween::Type tween_type) { | 210 gfx::Tween::Type tween_type) { |
| 208 float minimized_opacity = | 211 float minimized_opacity = |
| 209 (state == HomeCard::VISIBLE_MINIMIZED) ? 1.0f : 0.0f; | 212 (state == HomeCard::VISIBLE_MINIMIZED) ? 1.0f : 0.0f; |
| 213 // |minimized_background_| needs to be visible before scheduling animation. | |
| 214 if (state == HomeCard::VISIBLE_MINIMIZED) | |
| 215 minimized_background_->SetVisible(true); | |
| 216 | |
| 210 if (minimized_opacity != | 217 if (minimized_opacity != |
| 211 minimized_background_->layer()->GetTargetOpacity()) { | 218 minimized_background_->layer()->GetTargetOpacity()) { |
| 212 ui::ScopedLayerAnimationSettings settings( | 219 ui::ScopedLayerAnimationSettings settings( |
| 213 minimized_background_->layer()->GetAnimator()); | 220 minimized_background_->layer()->GetAnimator()); |
| 214 settings.SetTweenType(gfx::Tween::EASE_IN); | 221 settings.SetTweenType(gfx::Tween::EASE_IN); |
| 222 settings.AddObserver(new ui::ClosureAnimationObserver( | |
| 223 base::Bind(&HomeCardView::UpdateMinimizedBackgroundVisibility, | |
| 224 weak_factory_.GetWeakPtr()))); | |
| 215 minimized_background_->layer()->SetOpacity(minimized_opacity); | 225 minimized_background_->layer()->SetOpacity(minimized_opacity); |
| 216 } | 226 } |
| 217 | 227 |
| 218 gfx::Transform background_transform; | 228 gfx::Transform background_transform; |
| 219 if (state != HomeCard::VISIBLE_CENTERED) { | 229 if (state != HomeCard::VISIBLE_CENTERED) { |
| 220 background_transform.Scale( | 230 background_transform.Scale( |
| 221 SK_MScalar1, | 231 SK_MScalar1, |
| 222 SkIntToMScalar(kHomeCardHeight) / SkIntToMScalar(height())); | 232 SkIntToMScalar(kHomeCardHeight) / SkIntToMScalar(height())); |
| 223 } | 233 } |
| 224 float background_opacity = 1.0f - minimized_opacity; | 234 float background_opacity = 1.0f - minimized_opacity; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 void Layout() override { | 296 void Layout() override { |
| 287 gfx::Rect contents_bounds = GetContentsBounds(); | 297 gfx::Rect contents_bounds = GetContentsBounds(); |
| 288 background_->SetBoundsRect(contents_bounds); | 298 background_->SetBoundsRect(contents_bounds); |
| 289 main_view_->SetBoundsRect(contents_bounds); | 299 main_view_->SetBoundsRect(contents_bounds); |
| 290 minimized_background_->SetBoundsRect(contents_bounds); | 300 minimized_background_->SetBoundsRect(contents_bounds); |
| 291 drag_indicator_->SetBoundsRect( | 301 drag_indicator_->SetBoundsRect( |
| 292 GetDragIndicatorBounds(HomeCard::Get()->GetState())); | 302 GetDragIndicatorBounds(HomeCard::Get()->GetState())); |
| 293 } | 303 } |
| 294 | 304 |
| 295 private: | 305 private: |
| 306 void UpdateMinimizedBackgroundVisibility() { | |
| 307 minimized_background_->SetVisible( | |
| 308 minimized_background_->layer()->GetTargetOpacity() != 0.0f); | |
| 309 } | |
| 310 | |
| 296 // views::WidgetDelegate: | 311 // views::WidgetDelegate: |
| 297 views::View* GetContentsView() override { return this; } | 312 views::View* GetContentsView() override { return this; } |
| 298 | 313 |
| 299 // AthenaStartPageView::Observer: | 314 // AthenaStartPageView::Observer: |
| 300 void OnLayoutStateChanged(float new_state) override { | 315 void OnLayoutStateChanged(float new_state) override { |
| 301 if (new_state == 1.0f) | 316 if (new_state == 1.0f) |
| 302 HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED); | 317 HomeCard::Get()->SetState(HomeCard::VISIBLE_CENTERED); |
| 303 } | 318 } |
| 304 | 319 |
| 305 views::View* background_; | 320 views::View* background_; |
| 306 AthenaStartPageView* main_view_; | 321 AthenaStartPageView* main_view_; |
| 307 views::View* minimized_background_; | 322 views::View* minimized_background_; |
| 308 views::View* drag_indicator_; | 323 views::View* drag_indicator_; |
| 309 HomeCard::State state_; | 324 HomeCard::State state_; |
| 310 scoped_ptr<HomeCardGestureManager> gesture_manager_; | 325 scoped_ptr<HomeCardGestureManager> gesture_manager_; |
| 311 HomeCardGestureManager::Delegate* gesture_delegate_; | 326 HomeCardGestureManager::Delegate* gesture_delegate_; |
| 312 | 327 |
| 328 base::WeakPtrFactory<HomeCardView> weak_factory_; | |
| 329 | |
| 313 DISALLOW_COPY_AND_ASSIGN(HomeCardView); | 330 DISALLOW_COPY_AND_ASSIGN(HomeCardView); |
| 314 }; | 331 }; |
| 315 | 332 |
| 316 HomeCardImpl::HomeCardImpl(scoped_ptr<AppModelBuilder> model_builder, | 333 HomeCardImpl::HomeCardImpl(scoped_ptr<AppModelBuilder> model_builder, |
| 317 scoped_ptr<SearchControllerFactory> search_factory) | 334 scoped_ptr<SearchControllerFactory> search_factory) |
| 318 : model_builder_(model_builder.Pass()), | 335 : model_builder_(model_builder.Pass()), |
| 319 search_factory_(search_factory.Pass()), | 336 search_factory_(search_factory.Pass()), |
| 320 state_(HIDDEN), | 337 state_(HIDDEN), |
| 321 original_state_(VISIBLE_MINIMIZED), | 338 original_state_(VISIBLE_MINIMIZED), |
| 322 home_card_widget_(nullptr), | 339 home_card_widget_(nullptr), |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 502 instance = nullptr; | 519 instance = nullptr; |
| 503 } | 520 } |
| 504 | 521 |
| 505 // static | 522 // static |
| 506 HomeCard* HomeCard::Get() { | 523 HomeCard* HomeCard::Get() { |
| 507 DCHECK(instance); | 524 DCHECK(instance); |
| 508 return instance; | 525 return instance; |
| 509 } | 526 } |
| 510 | 527 |
| 511 } // namespace athena | 528 } // namespace athena |
| OLD | NEW |