toast_contents_view.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/views/toast_contents_view.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/animation/animation_delegate.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/animation/slide_animation.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/display.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/screen.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/message_center.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/message_center/message_center_style.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/notification.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/views/message_popup_collection.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/message_center/views/message_view.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/view.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace message_center { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The width of a toast before animated reveal and after closing. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kClosedToastWidth = 5; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// FadeIn/Out look a bit better if they are slightly longer then default slide. 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kFadeInOutDuration = 200; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace. 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size ToastContentsView::GetToastSizeForView(views::View* view) { 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int width = kNotificationWidth + view->GetInsets().width(); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Size(width, view->GetHeightForWidth(width)); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ToastContentsView::ToastContentsView( 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Notification* notification, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtr<MessagePopupCollection> collection, 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MessageCenter* message_center) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : collection_(collection), 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_center_(message_center), 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) id_(notification->id()), 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_animating_bounds_(false), 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_closing_(false), 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) closing_animation_(NULL) { 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(collection_); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_notify_enter_exit_on_child(true); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the transparent background. Then, when the message view is slid out, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the whole toast seems to slide although the actual bound of the widget 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // remains. This is hacky but easier to keep the consistency. 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_background(views::Background::CreateSolidBackground(0, 0, 0, 0)); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_.reset(new ui::SlideAnimation(this)); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->SetSlideDuration(kFadeInOutDuration); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is destroyed when the toast window closes. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ToastContentsView::~ToastContentsView() { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::Widget* ToastContentsView::CreateWidget(gfx::NativeView parent) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams params( 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams::TYPE_POPUP); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.keep_on_top = true; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (parent) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.parent = parent; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.top_level = true; 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.delegate = this; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget* widget = new views::Widget(); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->set_focus_on_creation(false); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->Init(params); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return widget; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::SetContents(MessageView* view) { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RemoveAllChildViews(true); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddChildView(view); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) preferred_size_ = GetToastSizeForView(view); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Layout(); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::RevealWithAnimation(gfx::Point origin) { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Place/move the toast widgets. Currently it stacks the widgets from the 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // right-bottom of the work area. 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(mukai): allow to specify the placement policy from outside of this 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // class. The policy should be specified from preference on Windows, or 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the launcher alignment on ChromeOS. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_ = gfx::Point(origin.x() - preferred_size_.width(), 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin.y() - preferred_size_.height()); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect stable_bounds(origin_, preferred_size_); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsInstantly(GetClosedToastBounds(stable_bounds)); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartFadeIn(); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetBoundsWithAnimation(stable_bounds); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::CloseWithAnimation(bool mark_as_shown) { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_closing_) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_closing_ = true; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (collection_) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) collection_->RemoveToast(this); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mark_as_shown) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_center_->MarkSinglePopupAsShown(id(), false); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartFadeOut(); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::SetBoundsInstantly(gfx::Rect new_bounds) { 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (new_bounds == bounds()) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_ = new_bounds.origin(); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!GetWidget()) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->SetBounds(new_bounds); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::SetBoundsWithAnimation(gfx::Rect new_bounds) { 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (new_bounds == bounds()) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) origin_ = new_bounds.origin(); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!GetWidget()) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This picks up the current bounds, so if there was a previous animation 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // half-done, the next one will pick up from the current location. 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is the only place that should query current location of the Widget 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // on screen, the rest should refer to the bounds_. 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animated_bounds_start_ = GetWidget()->GetWindowBoundsInScreen(); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animated_bounds_end_ = new_bounds; 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (collection_) 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) collection_->IncrementDeferCounter(); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (bounds_animation_.get()) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_animation_->Stop(); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_animation_.reset(new ui::SlideAnimation(this)); 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds_animation_->Show(); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::StartFadeIn() { 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (collection_) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) collection_->IncrementDeferCounter(); 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Stop(); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->SetOpacity(0); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->Show(); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Reset(0); 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Show(); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ToastContentsView::StartFadeOut() { 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The decrement is done in OnBoundsAnimationEndedOrCancelled callback. 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (collection_) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) collection_->IncrementDeferCounter(); 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Stop(); 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) closing_animation_ = (is_closing_ ? fade_animation_.get() : NULL); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Reset(1); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fade_animation_->Hide(); 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::OnBoundsAnimationEndedOrCancelled( 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ui::Animation* animation) { 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (is_closing_ && closing_animation_ == animation && GetWidget()) { 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::Widget* widget = GetWidget(); 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(USE_AURA) 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(dewittj): This is a workaround to prevent a nasty bug where 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // closing a transparent widget doesn't actually remove the window, 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // causing entire areas of the screen to become unresponsive to clicks. 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // See crbug.com/243469 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) widget->Hide(); 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)# if defined(OS_WIN) 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) widget->SetOpacity(0xFF); 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)# endif 19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) widget->Close(); 19390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // This cannot be called before GetWidget()->Close(). Decrementing defer count 196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // will invoke update, which may invoke another close animation with 197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // incrementing defer counter. Close() after such process will cause a 198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // mismatch between increment/decrement. See crbug.com/238477 199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (collection_) 200b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) collection_->DecrementDeferCounter(); 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ui::AnimationDelegate 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::AnimationProgressed(const ui::Animation* animation) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animation == bounds_animation_.get()) { 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect current(animation->CurrentValueBetween( 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) animated_bounds_start_, animated_bounds_end_)); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->SetBounds(current); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (animation == fade_animation_.get()) { 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char opacity = 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<unsigned char>(fade_animation_->GetCurrentValue() * 255); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetWidget()->SetOpacity(opacity); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::AnimationEnded(const ui::Animation* animation) { 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnBoundsAnimationEndedOrCancelled(animation); 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::AnimationCanceled( 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ui::Animation* animation) { 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnBoundsAnimationEndedOrCancelled(animation); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// views::WidgetDelegate 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)views::View* ToastContentsView::GetContentsView() { 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return this; 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::WindowClosing() { 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!is_closing_ && collection_) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) collection_->RemoveToast(this); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ToastContentsView::CanActivate() const { 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ToastContentsView::OnDisplayChanged() { 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::NativeView native_view = GetWidget()->GetNativeView(); 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch collection_->OnDisplayBoundsChanged(gfx::Screen::GetScreenFor( 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch native_view)->GetDisplayNearestWindow(native_view)); 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ToastContentsView::OnWorkAreaChanged() { 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::NativeView native_view = GetWidget()->GetNativeView(); 251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch collection_->OnDisplayBoundsChanged(gfx::Screen::GetScreenFor( 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch native_view)->GetDisplayNearestWindow(native_view)); 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// views::View 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::OnMouseEntered(const ui::MouseEvent& event) { 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (collection_) 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) collection_->OnMouseEntered(this); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::OnMouseExited(const ui::MouseEvent& event) { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (collection_) 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) collection_->OnMouseExited(this); 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ToastContentsView::Layout() { 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (child_count() > 0) { 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) child_at(0)->SetBounds( 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 0, preferred_size_.width(), preferred_size_.height()); 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size ToastContentsView::GetPreferredSize() { 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return child_count() ? GetToastSizeForView(child_at(0)) : gfx::Size(); 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ToastContentsView::GetAccessibleState(ui::AccessibleViewState* state) { 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (child_count() > 0) 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) child_at(0)->GetAccessibleState(state); 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state->role = ui::AccessibilityTypes::ROLE_WINDOW; 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ToastContentsView::GetClosedToastBounds(gfx::Rect bounds) { 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(bounds.x() + bounds.width() - kClosedToastWidth, 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds.y(), 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kClosedToastWidth, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bounds.height()); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace message_center 291