blob: 77a4def3513bab2c10ff7bf6c8378d7c1519ba4d [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
#define UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/views/message_center_controller.h"
#include "ui/views/widget/widget_delegate.h"
namespace gfx {
class Animation;
class SlideAnimation;
}
namespace views {
class View;
}
namespace message_center {
namespace test {
class MessagePopupCollectionTest;
}
class MessagePopupCollection;
class MessageView;
class Notification;
class PopupAlignmentDelegate;
// The widget host for a popup. Also implements MessageCenterController
// which delegates over to MessagePopupCollection, but takes care about
// checking the weakref since MessagePopupCollection may disappear before
// widget/views are closed/destructed.
class MESSAGE_CENTER_EXPORT ToastContentsView
: public views::WidgetDelegateView,
public MessageCenterController,
public gfx::AnimationDelegate {
public:
static const char kViewClassName[];
// Computes the size of a toast assuming it will host the given view.
static gfx::Size GetToastSizeForView(const views::View* view);
ToastContentsView(const std::string& notification_id,
PopupAlignmentDelegate* alignment_delegate,
base::WeakPtr<MessagePopupCollection> collection);
~ToastContentsView() override;
// Sets the inner view of the toast. If it has contents already,
// |a11y_feedback_for_updates| causes the view to notify that the
// accessibility message should be read after this update.
void SetContents(MessageView* view, bool a11y_feedback_for_updates);
void UpdateContents(const Notification& notification,
bool a11y_feedback_for_updates);
// Shows the new toast for the first time, animated.
// |origin| is the right-bottom corner of the toast.
void RevealWithAnimation(gfx::Point origin);
// Disconnectes the toast from the rest of the system immediately and start
// an animation. Once animation finishes, closes the widget.
void CloseWithAnimation();
void SetBoundsWithAnimation(gfx::Rect new_bounds);
// Makes the toast activatable, then activate.
void ActivateToast();
// Origin and bounds are not 'instant', but rather 'current stable values',
// there could be animation in progress that targets these values.
gfx::Point origin() { return origin_; }
gfx::Rect bounds() { return gfx::Rect(origin_, preferred_size_); }
const std::string& id() const { return id_; }
// Overridden from views::View:
void OnMouseEntered(const ui::MouseEvent& event) override;
void OnMouseExited(const ui::MouseEvent& event) override;
void Layout() override;
gfx::Size GetPreferredSize() const override;
void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
const char* GetClassName() const override;
private:
friend class test::MessagePopupCollectionTest;
// Overridden from MessageCenterController:
void ClickOnNotification(const std::string& notification_id) override;
void RemoveNotification(const std::string& notification_id,
bool by_user) override;
std::unique_ptr<ui::MenuModel> CreateMenuModel(
const NotifierId& notifier_id,
const base::string16& display_source) override;
bool HasClickedListener(const std::string& notification_id) override;
void ClickOnNotificationButton(const std::string& notification_id,
int button_index) override;
void ClickOnSettingsButton(const std::string& notification_id) override;
void UpdateNotificationSize(const std::string& notification_id) override;
// Overridden from gfx::AnimationDelegate:
void AnimationProgressed(const gfx::Animation* animation) override;
void AnimationEnded(const gfx::Animation* animation) override;
void AnimationCanceled(const gfx::Animation* animation) override;
// Overridden from views::WidgetDelegate:
void WindowClosing() override;
void OnDisplayChanged() override;
void OnWorkAreaChanged() override;
// Recalculates preferred size from underlying view and notifies about it.
void UpdatePreferredSize();
// Initialization and update.
void CreateWidget(PopupAlignmentDelegate* alignment_delegate);
// Immediately moves the toast without any sort of delay or animation.
void SetBoundsInstantly(gfx::Rect new_bounds);
// Given the bounds of a toast on the screen, compute the bounds for that
// toast in 'closed' node_data. The 'closed' node_data is used as
// origin/destination in reveal/closing animations.
gfx::Rect GetClosedToastBounds(gfx::Rect bounds);
void StartFadeIn();
void StartFadeOut(); // Will call Widget::Close() when animation ends.
void OnBoundsAnimationEndedOrCancelled(const gfx::Animation* animation);
base::WeakPtr<MessagePopupCollection> collection_;
// Id if the corresponding Notification.
std::string id_;
std::unique_ptr<gfx::SlideAnimation> bounds_animation_;
std::unique_ptr<gfx::SlideAnimation> fade_animation_;
gfx::Rect animated_bounds_start_;
gfx::Rect animated_bounds_end_;
// Started closing animation, will close at the end.
bool is_closing_;
// Closing animation - when it ends, close the widget. Weak, only used
// for referential equality.
gfx::Animation* closing_animation_;
gfx::Point origin_;
gfx::Size preferred_size_;
DISALLOW_COPY_AND_ASSIGN(ToastContentsView);
};
} // namespace message_center
#endif // UI_MESSAGE_CENTER_VIEWS_TOAST_CONTENTS_VIEW_H_