Commit 01433742 authored by Mitsuru Oshima's avatar Mitsuru Oshima Committed by Commit Bot

Show ItemWidget/Backdrop after overview animation ends.

Bug: 901402
Test: manual. The window title fades in after overview
  animation ends (in clamshell, tablet, from home launcher).
  and hides immediately when exiting.

Change-Id: I06b25ebea428439ec6e7ab2751db74409971855f
Reviewed-on: https://chromium-review.googlesource.com/c/1316363
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Reviewed-by: default avatarXiaoqian Dai <xdai@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605578}
parent d55b0dc1
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "ui/aura/client/aura_constants.h" #include "ui/aura/client/aura_constants.h"
#include "ui/aura/null_window_targeter.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/compositor/layer.h" #include "ui/compositor/layer.h"
#include "ui/compositor/layer_observer.h" #include "ui/compositor/layer_observer.h"
...@@ -184,9 +185,15 @@ ScopedTransformOverviewWindow::ScopedTransformOverviewWindow( ...@@ -184,9 +185,15 @@ ScopedTransformOverviewWindow::ScopedTransformOverviewWindow(
original_mask_layer_(window_->layer()->layer_mask_layer()), original_mask_layer_(window_->layer()->layer_mask_layer()),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
type_ = GetWindowDimensionsType(window); type_ = GetWindowDimensionsType(window);
original_targeter_ =
window_->SetEventTargeter(std::make_unique<aura::NullWindowTargeter>());
null_targeter_ = window_->targeter();
} }
ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() { ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {
if (null_targeter_ == window_->targeter())
window_->SetEventTargeter(std::move(original_targeter_));
StopObservingImplicitAnimations(); StopObservingImplicitAnimations();
} }
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
namespace aura { namespace aura {
class Window; class Window;
class WindowTargeter;
} }
namespace gfx { namespace gfx {
...@@ -231,6 +232,15 @@ class ASH_EXPORT ScopedTransformOverviewWindow ...@@ -231,6 +232,15 @@ class ASH_EXPORT ScopedTransformOverviewWindow
// The original mask layer of the window before entering overview mode. // The original mask layer of the window before entering overview mode.
ui::Layer* original_mask_layer_ = nullptr; ui::Layer* original_mask_layer_ = nullptr;
// Stores the targeter for the window. For the duration of this object,
// |window_|'s event targeter will be replaced by a NullWindowTargeter to
// prevent events from reaching |window_|.
// TODO(sammiequon): Investigate if we can use a custom event targeter on
// windows for overview mode and remove the need for the extra widget which
// blocks events in WindowSelectorItem.
std::unique_ptr<aura::WindowTargeter> original_targeter_;
aura::WindowTargeter* null_targeter_ = nullptr;
base::WeakPtrFactory<ScopedTransformOverviewWindow> weak_ptr_factory_; base::WeakPtrFactory<ScopedTransformOverviewWindow> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ScopedTransformOverviewWindow); DISALLOW_COPY_AND_ASSIGN(ScopedTransformOverviewWindow);
......
...@@ -496,6 +496,9 @@ void WindowGrid::AddItem(aura::Window* window, bool reposition, bool animate) { ...@@ -496,6 +496,9 @@ void WindowGrid::AddItem(aura::Window* window, bool reposition, bool animate) {
window_list_.begin(), window_list_.begin(),
std::make_unique<WindowSelectorItem>(window, window_selector_, this)); std::make_unique<WindowSelectorItem>(window, window_selector_, this));
window_list_.front()->PrepareForOverview(); window_list_.front()->PrepareForOverview();
// The item is added after overview enter animation is complete, so
// just call OnStartingAnimationComplete.
window_list_.front()->OnStartingAnimationComplete();
if (reposition) if (reposition)
PositionWindows(animate); PositionWindows(animate);
......
...@@ -749,6 +749,10 @@ void WindowSelector::OnStartingAnimationComplete(bool canceled) { ...@@ -749,6 +749,10 @@ void WindowSelector::OnStartingAnimationComplete(bool canceled) {
UpdateMaskAndShadow(!canceled); UpdateMaskAndShadow(!canceled);
if (text_filter_widget_) if (text_filter_widget_)
text_filter_widget_->Show(); text_filter_widget_->Show();
for (auto& grid : grid_list_) {
for (auto& window : grid->window_list())
window->OnStartingAnimationComplete();
}
} }
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/shell_window_ids.h"
#include "ash/public/cpp/window_properties.h" #include "ash/public/cpp/window_properties.h"
#include "ash/resources/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h"
#include "ash/scoped_animation_disabler.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h" #include "ash/strings/grit/ash_strings.h"
#include "ash/wm/overview/overview_animation_type.h" #include "ash/wm/overview/overview_animation_type.h"
...@@ -137,6 +138,7 @@ std::unique_ptr<views::Widget> CreateBackdropWidget(aura::Window* parent) { ...@@ -137,6 +138,7 @@ std::unique_ptr<views::Widget> CreateBackdropWidget(aura::Window* parent) {
/*border_thickness=*/0, kBackdropRoundingDp, kBackdropColor, /*border_thickness=*/0, kBackdropRoundingDp, kBackdropColor,
/*initial_opacity=*/1.f, parent, /*initial_opacity=*/1.f, parent,
/*stack_on_top=*/false); /*stack_on_top=*/false);
widget->GetNativeWindow()->SetName("OverviewBackdrop");
return widget; return widget;
} }
...@@ -495,10 +497,6 @@ WindowSelectorItem::WindowSelectorItem(aura::Window* window, ...@@ -495,10 +497,6 @@ WindowSelectorItem::WindowSelectorItem(aura::Window* window,
window_grid_(window_grid) { window_grid_(window_grid) {
CreateWindowLabel(window->GetTitle()); CreateWindowLabel(window->GetTitle());
GetWindow()->AddObserver(this); GetWindow()->AddObserver(this);
if (GetWindowDimensionsType() !=
ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
backdrop_widget_ = CreateBackdropWidget(window->parent());
}
GetWindow()->SetProperty(ash::kIsShowingInOverviewKey, true); GetWindow()->SetProperty(ash::kIsShowingInOverviewKey, true);
} }
...@@ -564,15 +562,10 @@ void WindowSelectorItem::Shutdown() { ...@@ -564,15 +562,10 @@ void WindowSelectorItem::Shutdown() {
return; return;
} }
// Fade out the item widget. This animation continues past the lifetime // Close the item widget without animation to reduce the load during exit
// of |this|. // animation.
const bool slide = window_selector_->enter_exit_overview_type() == ScopedAnimationDisabler(item_widget_->GetNativeWindow());
WindowSelector::EnterExitOverviewType::kWindowsMinimized; item_widget_.reset();
FadeOutWidgetAndMaybeSlideOnExit(
std::move(item_widget_),
slide ? OVERVIEW_ANIMATION_EXIT_TO_HOME_LAUNCHER
: OVERVIEW_ANIMATION_EXIT_OVERVIEW_MODE_FADE_OUT,
slide);
} }
void WindowSelectorItem::PrepareForOverview() { void WindowSelectorItem::PrepareForOverview() {
...@@ -584,11 +577,8 @@ void WindowSelectorItem::PrepareForOverview() { ...@@ -584,11 +577,8 @@ void WindowSelectorItem::PrepareForOverview() {
void WindowSelectorItem::SlideWindowIn() { void WindowSelectorItem::SlideWindowIn() {
// |transform_window_|'s |minimized_widget| is non null because this only gets // |transform_window_|'s |minimized_widget| is non null because this only gets
// called if we see the home launcher on enter (all windows are minimized). // called if we see the home launcher on enter (all windows are minimized).
DCHECK(item_widget_);
DCHECK(transform_window_.minimized_widget()); DCHECK(transform_window_.minimized_widget());
FadeInWidgetAndMaybeSlideOnEnter(item_widget_.get(), // The |item_widget_| will be shown when animation ends.
OVERVIEW_ANIMATION_ENTER_FROM_HOME_LAUNCHER,
/*slide=*/true);
FadeInWidgetAndMaybeSlideOnEnter(transform_window_.minimized_widget(), FadeInWidgetAndMaybeSlideOnEnter(transform_window_.minimized_widget(),
OVERVIEW_ANIMATION_ENTER_FROM_HOME_LAUNCHER, OVERVIEW_ANIMATION_ENTER_FROM_HOME_LAUNCHER,
/*slide=*/true); /*slide=*/true);
...@@ -793,6 +783,7 @@ WindowSelectorItem::GetWindowDimensionsType() const { ...@@ -793,6 +783,7 @@ WindowSelectorItem::GetWindowDimensionsType() const {
} }
void WindowSelectorItem::UpdateWindowDimensionsType() { void WindowSelectorItem::UpdateWindowDimensionsType() {
// TODO(oshima|sammiequan|xdai): Use EnableBackdropIfNeeded.
transform_window_.UpdateWindowDimensionsType(); transform_window_.UpdateWindowDimensionsType();
if (GetWindowDimensionsType() == if (GetWindowDimensionsType() ==
ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) { ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
...@@ -814,7 +805,10 @@ void WindowSelectorItem::EnableBackdropIfNeeded() { ...@@ -814,7 +805,10 @@ void WindowSelectorItem::EnableBackdropIfNeeded() {
DisableBackdrop(); DisableBackdrop();
return; return;
} }
if (!backdrop_widget_) {
backdrop_widget_ =
CreateBackdropWidget(transform_window_.window()->parent());
}
UpdateBackdropBounds(); UpdateBackdropBounds();
} }
...@@ -1055,6 +1049,14 @@ void WindowSelectorItem::UpdateMaskAndShadow(bool show) { ...@@ -1055,6 +1049,14 @@ void WindowSelectorItem::UpdateMaskAndShadow(bool show) {
EnableBackdropIfNeeded(); EnableBackdropIfNeeded();
} }
void WindowSelectorItem::OnStartingAnimationComplete() {
DCHECK(item_widget_.get());
FadeInWidgetAndMaybeSlideOnEnter(
item_widget_.get(), OVERVIEW_ANIMATION_ENTER_OVERVIEW_MODE_FADE_IN,
/*slide=*/false);
EnableBackdropIfNeeded();
}
void WindowSelectorItem::SetOpacity(float opacity) { void WindowSelectorItem::SetOpacity(float opacity) {
item_widget_->SetOpacity(opacity); item_widget_->SetOpacity(opacity);
transform_window_.SetOpacity(opacity); transform_window_.SetOpacity(opacity);
...@@ -1180,9 +1182,6 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) { ...@@ -1180,9 +1182,6 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
item_widget_->Show(); item_widget_->Show();
item_widget_->SetOpacity(0); item_widget_->SetOpacity(0);
item_widget_->GetLayer()->SetMasksToBounds(false); item_widget_->GetLayer()->SetMasksToBounds(false);
FadeInWidgetAndMaybeSlideOnEnter(
item_widget_.get(), OVERVIEW_ANIMATION_ENTER_OVERVIEW_MODE_FADE_IN,
/*slide=*/false);
} }
void WindowSelectorItem::UpdateHeaderLayout( void WindowSelectorItem::UpdateHeaderLayout(
......
...@@ -236,6 +236,10 @@ class ASH_EXPORT WindowSelectorItem : public views::ButtonListener, ...@@ -236,6 +236,10 @@ class ASH_EXPORT WindowSelectorItem : public views::ButtonListener,
// Show or hide the mask and shadow on this window item. // Show or hide the mask and shadow on this window item.
void UpdateMaskAndShadow(bool show); void UpdateMaskAndShadow(bool show);
// Called when the starting animation is completed, or called immediately
// if there was no starting animation.
void OnStartingAnimationComplete();
// Changes the opacity of all the windows the item owns. // Changes the opacity of all the windows the item owns.
void SetOpacity(float opacity); void SetOpacity(float opacity);
float GetOpacity(); float GetOpacity();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment