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 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/null_window_targeter.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_observer.h"
......@@ -184,9 +185,15 @@ ScopedTransformOverviewWindow::ScopedTransformOverviewWindow(
original_mask_layer_(window_->layer()->layer_mask_layer()),
weak_ptr_factory_(this) {
type_ = GetWindowDimensionsType(window);
original_targeter_ =
window_->SetEventTargeter(std::make_unique<aura::NullWindowTargeter>());
null_targeter_ = window_->targeter();
}
ScopedTransformOverviewWindow::~ScopedTransformOverviewWindow() {
if (null_targeter_ == window_->targeter())
window_->SetEventTargeter(std::move(original_targeter_));
StopObservingImplicitAnimations();
}
......
......@@ -20,6 +20,7 @@
namespace aura {
class Window;
class WindowTargeter;
}
namespace gfx {
......@@ -231,6 +232,15 @@ class ASH_EXPORT ScopedTransformOverviewWindow
// The original mask layer of the window before entering overview mode.
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_;
DISALLOW_COPY_AND_ASSIGN(ScopedTransformOverviewWindow);
......
......@@ -496,6 +496,9 @@ void WindowGrid::AddItem(aura::Window* window, bool reposition, bool animate) {
window_list_.begin(),
std::make_unique<WindowSelectorItem>(window, window_selector_, this));
window_list_.front()->PrepareForOverview();
// The item is added after overview enter animation is complete, so
// just call OnStartingAnimationComplete.
window_list_.front()->OnStartingAnimationComplete();
if (reposition)
PositionWindows(animate);
......
......@@ -749,6 +749,10 @@ void WindowSelector::OnStartingAnimationComplete(bool canceled) {
UpdateMaskAndShadow(!canceled);
if (text_filter_widget_)
text_filter_widget_->Show();
for (auto& grid : grid_list_) {
for (auto& window : grid->window_list())
window->OnStartingAnimationComplete();
}
}
}
......
......@@ -10,6 +10,7 @@
#include "ash/public/cpp/shell_window_ids.h"
#include "ash/public/cpp/window_properties.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/scoped_animation_disabler.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/wm/overview/overview_animation_type.h"
......@@ -137,6 +138,7 @@ std::unique_ptr<views::Widget> CreateBackdropWidget(aura::Window* parent) {
/*border_thickness=*/0, kBackdropRoundingDp, kBackdropColor,
/*initial_opacity=*/1.f, parent,
/*stack_on_top=*/false);
widget->GetNativeWindow()->SetName("OverviewBackdrop");
return widget;
}
......@@ -495,10 +497,6 @@ WindowSelectorItem::WindowSelectorItem(aura::Window* window,
window_grid_(window_grid) {
CreateWindowLabel(window->GetTitle());
GetWindow()->AddObserver(this);
if (GetWindowDimensionsType() !=
ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
backdrop_widget_ = CreateBackdropWidget(window->parent());
}
GetWindow()->SetProperty(ash::kIsShowingInOverviewKey, true);
}
......@@ -564,15 +562,10 @@ void WindowSelectorItem::Shutdown() {
return;
}
// Fade out the item widget. This animation continues past the lifetime
// of |this|.
const bool slide = window_selector_->enter_exit_overview_type() ==
WindowSelector::EnterExitOverviewType::kWindowsMinimized;
FadeOutWidgetAndMaybeSlideOnExit(
std::move(item_widget_),
slide ? OVERVIEW_ANIMATION_EXIT_TO_HOME_LAUNCHER
: OVERVIEW_ANIMATION_EXIT_OVERVIEW_MODE_FADE_OUT,
slide);
// Close the item widget without animation to reduce the load during exit
// animation.
ScopedAnimationDisabler(item_widget_->GetNativeWindow());
item_widget_.reset();
}
void WindowSelectorItem::PrepareForOverview() {
......@@ -584,11 +577,8 @@ void WindowSelectorItem::PrepareForOverview() {
void WindowSelectorItem::SlideWindowIn() {
// |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).
DCHECK(item_widget_);
DCHECK(transform_window_.minimized_widget());
FadeInWidgetAndMaybeSlideOnEnter(item_widget_.get(),
OVERVIEW_ANIMATION_ENTER_FROM_HOME_LAUNCHER,
/*slide=*/true);
// The |item_widget_| will be shown when animation ends.
FadeInWidgetAndMaybeSlideOnEnter(transform_window_.minimized_widget(),
OVERVIEW_ANIMATION_ENTER_FROM_HOME_LAUNCHER,
/*slide=*/true);
......@@ -793,6 +783,7 @@ WindowSelectorItem::GetWindowDimensionsType() const {
}
void WindowSelectorItem::UpdateWindowDimensionsType() {
// TODO(oshima|sammiequan|xdai): Use EnableBackdropIfNeeded.
transform_window_.UpdateWindowDimensionsType();
if (GetWindowDimensionsType() ==
ScopedTransformOverviewWindow::GridWindowFillMode::kNormal) {
......@@ -814,7 +805,10 @@ void WindowSelectorItem::EnableBackdropIfNeeded() {
DisableBackdrop();
return;
}
if (!backdrop_widget_) {
backdrop_widget_ =
CreateBackdropWidget(transform_window_.window()->parent());
}
UpdateBackdropBounds();
}
......@@ -1055,6 +1049,14 @@ void WindowSelectorItem::UpdateMaskAndShadow(bool show) {
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) {
item_widget_->SetOpacity(opacity);
transform_window_.SetOpacity(opacity);
......@@ -1180,9 +1182,6 @@ void WindowSelectorItem::CreateWindowLabel(const base::string16& title) {
item_widget_->Show();
item_widget_->SetOpacity(0);
item_widget_->GetLayer()->SetMasksToBounds(false);
FadeInWidgetAndMaybeSlideOnEnter(
item_widget_.get(), OVERVIEW_ANIMATION_ENTER_OVERVIEW_MODE_FADE_IN,
/*slide=*/false);
}
void WindowSelectorItem::UpdateHeaderLayout(
......
......@@ -236,6 +236,10 @@ class ASH_EXPORT WindowSelectorItem : public views::ButtonListener,
// Show or hide the mask and shadow on this window item.
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.
void SetOpacity(float opacity);
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