Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3180)

Unified Diff: ash/system/web_notification/web_notification_tray.cc

Issue 11819048: Implement message center on Windows (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase on master @fa1d2262 and rearrange dependencies. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/system/web_notification/web_notification_tray.cc
diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc
index c83eae76150101dc076792657ea37334162030ae..334e52d1f4371f36c3bbc8643350ed2ee70f52ee 100644
--- a/ash/system/web_notification/web_notification_tray.cc
+++ b/ash/system/web_notification/web_notification_tray.cc
@@ -4,169 +4,89 @@
#include "ash/system/web_notification/web_notification_tray.h"
+#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/system/status_area_widget.h"
-#include "ash/system/tray/tray_bubble_wrapper.h"
-#include "ash/system/tray/tray_constants.h"
-#include "ash/system/tray/tray_views.h"
#include "ash/wm/shelf_layout_manager.h"
-#include "base/message_loop.h"
-#include "base/stringprintf.h"
#include "grit/ash_resources.h"
#include "grit/ash_strings.h"
-#include "ui/aura/window.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/screen.h"
-#include "ui/message_center/message_center_bubble.h"
-#include "ui/message_center/message_popup_bubble.h"
+#include "ui/message_center/message_center_tray.h"
+#include "ui/message_center/message_center_tray_host.h"
#include "ui/message_center/quiet_mode_bubble.h"
-#include "ui/views/bubble/tray_bubble_view.h"
-#include "ui/views/widget/widget_observer.h"
-namespace {
+#if defined(ENABLE_MESSAGE_CENTER) && !defined(OS_WIN)
Pete Williamson 2013/01/16 19:43:20 Should we check for not windows or that we do have
dewittj 2013/01/16 22:30:40 There is a windows version of this function, in ch
+namespace chrome {
-// Tray constants
-const int kTrayContainerVerticalPaddingBottomAlignment = 3;
-const int kTrayContainerHorizontalPaddingBottomAlignment = 1;
-const int kTrayContainerVerticalPaddingVerticalAlignment = 1;
-const int kTrayContainerHorizontalPaddingVerticalAlignment = 0;
-const int kPaddingFromLeftEdgeOfSystemTrayBottomAlignment = 8;
-const int kPaddingFromTopEdgeOfSystemTrayVerticalAlignment = 10;
-
-} // namespace
-
-namespace ash {
-
-namespace internal {
-
-// Class to initialize and manage the WebNotificationBubble and
-// TrayBubbleWrapper instances for a bubble.
-
-class WebNotificationBubbleWrapper {
- public:
- // Takes ownership of |bubble| and creates |bubble_wrapper_|.
- WebNotificationBubbleWrapper(WebNotificationTray* tray,
- message_center::MessageBubbleBase* bubble) {
- bubble_.reset(bubble);
- views::TrayBubbleView::AnchorAlignment anchor_alignment =
- tray->GetAnchorAlignment();
- views::TrayBubbleView::InitParams init_params =
- bubble->GetInitParams(anchor_alignment);
- views::View* anchor = tray->tray_container();
- if (anchor_alignment == views::TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) {
- gfx::Point bounds(anchor->width() / 2, 0);
- views::View::ConvertPointToWidget(anchor, &bounds);
- init_params.arrow_offset = bounds.x();
- }
- views::TrayBubbleView* bubble_view = views::TrayBubbleView::Create(
- tray->GetBubbleWindowContainer(), anchor, tray, &init_params);
- bubble_wrapper_.reset(new TrayBubbleWrapper(tray, bubble_view));
- bubble->InitializeContents(bubble_view);
- }
-
- message_center::MessageBubbleBase* bubble() const { return bubble_.get(); }
+ui::MessageCenterTrayHost* GetMessageCenterTray() {
+ return ash::Shell::GetPrimaryRootWindowController()->status_area_widget()->
+ web_notification_tray();
+}
- // Convenience accessors.
- views::TrayBubbleView* bubble_view() const { return bubble_->bubble_view(); }
+} // namespace chrome
+#endif
- private:
- scoped_ptr<message_center::MessageBubbleBase> bubble_;
- scoped_ptr<internal::TrayBubbleWrapper> bubble_wrapper_;
-};
-} // namespace internal
+namespace ash {
Pete Williamson 2013/01/16 19:43:20 Where did the WebNotificationBubbleWrapper functio
dewittj 2013/01/16 22:30:40 It was squashed partly into the MessageCenterTray
WebNotificationTray::WebNotificationTray(
internal::StatusAreaWidget* status_area_widget)
- : internal::TrayBackgroundView(status_area_widget),
+ : TrayBackgroundView(status_area_widget),
button_(NULL),
- show_message_center_on_unlock_(false) {
- message_center_ = message_center::MessageCenter::GetInstance();
- message_center_->AddObserver(this);
+ show_message_center_on_unlock_(false),
+ message_center_visible_(false) {
button_ = new views::ImageButton(this);
button_->set_triggerable_event_flags(
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_RIGHT_MOUSE_BUTTON);
tray_container()->AddChildView(button_);
SetVisible(false);
- UpdateTray();
+ message_center_tray_ = make_scoped_ptr(new ui::MessageCenterTray(this));
+ OnMessageCenterTrayChanged();
}
-WebNotificationTray::~WebNotificationTray() {
- // Ensure the message center doesn't notify a destroyed object.
- message_center_->RemoveObserver(this);
- // Release any child views that might have back pointers before ~View().
- message_center_bubble_.reset();
- popup_bubble_.reset();
- if (quiet_mode_bubble() && quiet_mode_bubble_->GetBubbleWidget())
- quiet_mode_bubble_->GetBubbleWidget()->RemoveObserver(this);
- quiet_mode_bubble_.reset();
+WebNotificationTray::~WebNotificationTray() { }
+
+bool WebNotificationTray::CanShowMessageCenter() {
+ return status_area_widget()->login_status() != user::LOGGED_IN_LOCKED &&
+ status_area_widget()->ShouldShowWebNotifications();
}
-void WebNotificationTray::ShowMessageCenterBubble() {
- if (status_area_widget()->login_status() == user::LOGGED_IN_LOCKED)
- return;
- if (quiet_mode_bubble())
- quiet_mode_bubble_.reset();
- if (message_center_bubble()) {
- UpdateTray();
- return;
- }
- // Indicate that the message center is visible. Clears the unread count.
- message_center_->SetMessageCenterVisible(true);
- UpdateTray();
- HidePopupBubble();
- message_center::MessageCenterBubble* bubble =
- new message_center::MessageCenterBubble(message_center_);
- message_center_bubble_.reset(
- new internal::WebNotificationBubbleWrapper(this, bubble));
+message_center::MessageCenter* WebNotificationTray::message_center() {
+ return message_center_tray_->message_center();
+}
+
+void WebNotificationTray::OnShowMessageCenterBubble() {
+ message_center_visible_ = true;
status_area_widget()->SetHideSystemNotifications(true);
GetShelfLayoutManager()->UpdateAutoHideState();
}
-void WebNotificationTray::HideMessageCenterBubble() {
- if (!message_center_bubble())
- return;
- message_center_bubble_.reset();
+void WebNotificationTray::OnHideMessageCenterBubble() {
+ message_center_visible_ = false;
show_message_center_on_unlock_ = false;
- message_center_->SetMessageCenterVisible(false);
- UpdateTray();
status_area_widget()->SetHideSystemNotifications(false);
GetShelfLayoutManager()->UpdateAutoHideState();
}
void WebNotificationTray::SetHidePopupBubble(bool hide) {
if (hide)
- HidePopupBubble();
+ message_center_tray_->HidePopupBubble();
else
- ShowPopupBubble();
+ message_center_tray_->ShowPopupBubble();
}
-void WebNotificationTray::ShowPopupBubble() {
- if (status_area_widget()->login_status() == user::LOGGED_IN_LOCKED)
- return;
- if (message_center_bubble())
- return;
- if (!status_area_widget()->ShouldShowWebNotifications())
- return;
- UpdateTray();
- if (popup_bubble()) {
- popup_bubble()->bubble()->ScheduleUpdate();
- } else if (message_center_->HasPopupNotifications()) {
- popup_bubble_.reset(
- new internal::WebNotificationBubbleWrapper(
- this, new message_center::MessagePopupBubble(
- message_center_)));
- }
+bool WebNotificationTray::CanShowPopups() {
+ return status_area_widget()->login_status() != user::LOGGED_IN_LOCKED &&
+ status_area_widget()->ShouldShowWebNotifications();
}
-void WebNotificationTray::HidePopupBubble() {
- popup_bubble_.reset();
-}
-bool WebNotificationTray::ShouldShowQuietModeBubble(const ui::Event& event) {
+namespace { // XXX move this to top after merge
+
+bool ShouldShowQuietModeBubble(const ui::Event& event) {
// TODO(mukai): Add keyboard event handler.
if (!event.IsMouseEvent())
return false;
@@ -177,12 +97,16 @@ bool WebNotificationTray::ShouldShowQuietModeBubble(const ui::Event& event) {
return mouse_event->IsRightMouseButton();
}
+} // namespace
+
void WebNotificationTray::ShowQuietModeBubble() {
aura::Window* parent = Shell::GetContainer(
Shell::GetPrimaryRootWindow(),
internal::kShellWindowId_SettingBubbleContainer);
quiet_mode_bubble_.reset(new message_center::QuietModeBubble(
- button_, parent, message_center_->notification_list()));
+ button_,
+ parent,
+ message_center_tray_->message_center()->notification_list()));
quiet_mode_bubble_->GetBubbleWidget()->StackAtTop();
quiet_mode_bubble_->GetBubbleWidget()->AddObserver(this);
}
@@ -190,36 +114,36 @@ void WebNotificationTray::ShowQuietModeBubble() {
void WebNotificationTray::UpdateAfterLoginStatusChange(
user::LoginStatus login_status) {
if (login_status == user::LOGGED_IN_LOCKED) {
- if (message_center_bubble()) {
- message_center_bubble_.reset();
+ bool hidden = message_center_tray_->HideMessageCenterBubble();
+ if (hidden)
show_message_center_on_unlock_ = true;
- }
- HidePopupBubble();
+ message_center_tray_->HidePopupBubble();
} else {
if (show_message_center_on_unlock_)
- ShowMessageCenterBubble();
+ message_center_tray_->ShowMessageCenterBubble();
show_message_center_on_unlock_ = false;
}
// The status icon should be always visible except for lock screen / login
// screen, to allow quiet mode and settings.
SetVisible((login_status != user::LOGGED_IN_NONE) &&
(login_status != user::LOGGED_IN_LOCKED));
- UpdateTray();
+ OnMessageCenterTrayChanged();
}
bool WebNotificationTray::ShouldBlockLauncherAutoHide() const {
- return IsMessageCenterBubbleVisible() || quiet_mode_bubble() != NULL;
+ return message_center_visible_ || quiet_mode_bubble_.get() != NULL;
}
bool WebNotificationTray::IsMessageCenterBubbleVisible() const {
- return (message_center_bubble() &&
- message_center_bubble_->bubble()->IsVisible());
+ return message_center_visible_;
}
bool WebNotificationTray::IsMouseInNotificationBubble() const {
- if (!popup_bubble())
+ // We only care about the mouse being in the popup view.
+ views::View* popup_bubble_view = message_center_tray_->GetPopupBubbleView();
+ if (!popup_bubble_view)
return false;
- return popup_bubble_->bubble_view()->GetBoundsInScreen().Contains(
+ return popup_bubble_view->GetBoundsInScreen().Contains(
Shell::GetScreen()->GetCursorScreenPoint());
}
@@ -228,23 +152,27 @@ void WebNotificationTray::SetShelfAlignment(ShelfAlignment alignment) {
return;
internal::TrayBackgroundView::SetShelfAlignment(alignment);
// Destroy any existing bubble so that it will be rebuilt correctly.
- HideMessageCenterBubble();
- HidePopupBubble();
+ message_center_tray_->HideMessageCenterBubble();
+ message_center_tray_->HidePopupBubble();
}
void WebNotificationTray::AnchorUpdated() {
- if (popup_bubble_.get()) {
- popup_bubble_->bubble_view()->UpdateBubble();
+ views::TrayBubbleView* popup_bubble_view =
+ message_center_tray_->GetPopupBubbleView();
+ if (popup_bubble_view) {
+ popup_bubble_view->UpdateBubble();
// Ensure that the notification buble is above the launcher/status area.
- popup_bubble_->bubble_view()->GetWidget()->StackAtTop();
- UpdateBubbleViewArrow(popup_bubble_->bubble_view());
+ popup_bubble_view->GetWidget()->StackAtTop();
+ UpdateBubbleViewArrow(popup_bubble_view);
}
- if (message_center_bubble_.get()) {
- message_center_bubble_->bubble_view()->UpdateBubble();
- UpdateBubbleViewArrow(message_center_bubble_->bubble_view());
+ views::TrayBubbleView* message_center_bubble_view =
+ message_center_tray_->GetMessageCenterBubbleView();
+ if (message_center_bubble_view) {
+ message_center_bubble_view->UpdateBubble();
+ UpdateBubbleViewArrow(message_center_bubble_view);
}
// Quiet mode settings bubble has to be on top.
- if (quiet_mode_bubble() && quiet_mode_bubble_->GetBubbleWidget())
+ if (quiet_mode_bubble_.get() && quiet_mode_bubble_->GetBubbleWidget())
quiet_mode_bubble_->GetBubbleWidget()->StackAtTop();
}
@@ -255,72 +183,33 @@ string16 WebNotificationTray::GetAccessibleNameForTray() {
void WebNotificationTray::HideBubbleWithView(
const views::TrayBubbleView* bubble_view) {
- if (message_center_bubble() &&
- bubble_view == message_center_bubble()->bubble_view()) {
- HideMessageCenterBubble();
- } else if (popup_bubble() && bubble_view == popup_bubble()->bubble_view()) {
- HidePopupBubble();
- }
+ message_center_tray_->HideBubble(bubble_view);
}
bool WebNotificationTray::PerformAction(const ui::Event& event) {
- if (!quiet_mode_bubble() && ShouldShowQuietModeBubble(event)) {
+ if (!quiet_mode_bubble_.get() && ShouldShowQuietModeBubble(event)) {
+ //XXX Put these back in?
Pete Williamson 2013/01/16 19:43:20 This should be resolved before checkin. Also, the
dewittj 2013/01/16 22:30:40 The XXX means I'm definitely not checking it in.
+ message_center_tray_->HideMessageCenterBubble();
+ message_center_tray_->HidePopupBubble();
ShowQuietModeBubble();
return true;
}
quiet_mode_bubble_.reset();
- ToggleMessageCenterBubble();
+ message_center_tray_->ToggleMessageCenterBubble();
return true;
}
Pete Williamson 2013/01/16 19:43:20 Where did BubbleViewDestroyed go?
dewittj 2013/01/16 22:30:40 It's back.
-void WebNotificationTray::BubbleViewDestroyed() {
- if (message_center_bubble())
- message_center_bubble()->bubble()->BubbleViewDestroyed();
- if (popup_bubble())
- popup_bubble()->bubble()->BubbleViewDestroyed();
-}
-
-void WebNotificationTray::OnMouseEnteredView() {
- if (popup_bubble())
- popup_bubble()->bubble()->OnMouseEnteredView();
-}
-
-void WebNotificationTray::OnMouseExitedView() {
- if (popup_bubble())
- popup_bubble()->bubble()->OnMouseExitedView();
-}
-
string16 WebNotificationTray::GetAccessibleNameForBubble() {
return GetAccessibleNameForTray();
}
-gfx::Rect WebNotificationTray::GetAnchorRect(views::Widget* anchor_widget,
- AnchorType anchor_type,
- AnchorAlignment anchor_alignment) {
+gfx::Rect WebNotificationTray::GetAnchorRect(
+ views::Widget* anchor_widget,
+ views::TrayBubbleView::AnchorType anchor_type,
+ views::TrayBubbleView::AnchorAlignment anchor_alignment) {
return GetBubbleAnchorRect(anchor_widget, anchor_type, anchor_alignment);
}
-void WebNotificationTray::HideBubble(const views::TrayBubbleView* bubble_view) {
- HideBubbleWithView(bubble_view);
-}
-
-void WebNotificationTray::OnMessageCenterChanged(bool new_notification) {
- if (message_center_bubble()) {
- if (message_center_->NotificationCount() == 0)
- HideMessageCenterBubble();
- else
- message_center_bubble()->bubble()->ScheduleUpdate();
- }
- if (popup_bubble()) {
- if (message_center_->NotificationCount() == 0)
- HidePopupBubble();
- else
- popup_bubble()->bubble()->ScheduleUpdate();
- }
- UpdateTray();
- if (new_notification)
- ShowPopupBubble();
-}
void WebNotificationTray::ButtonPressed(views::Button* sender,
const ui::Event& event) {
@@ -329,25 +218,40 @@ void WebNotificationTray::ButtonPressed(views::Button* sender,
}
void WebNotificationTray::OnWidgetClosing(views::Widget* widget) {
- if (quiet_mode_bubble() && quiet_mode_bubble_->GetBubbleWidget() == widget) {
+ if (quiet_mode_bubble_.get() &&
+ quiet_mode_bubble_->GetBubbleWidget() == widget) {
widget->RemoveObserver(this);
}
quiet_mode_bubble_.reset();
}
-// Private methods
+gfx::NativeView WebNotificationTray::GetBubbleWindowContainer() {
+ return TrayBackgroundView::GetBubbleWindowContainer();
+}
-void WebNotificationTray::ToggleMessageCenterBubble() {
- if (message_center_bubble())
- HideMessageCenterBubble();
- else
- ShowMessageCenterBubble();
- UpdateTray();
+views::View* WebNotificationTray::GetAnchorView() {
+ return tray_container();
}
-void WebNotificationTray::UpdateTray() {
+views::TrayBubbleView::AnchorAlignment
+WebNotificationTray::GetAnchorAlignment() {
+ return TrayBackgroundView::GetAnchorAlignment();
+}
+
+void WebNotificationTray::UpdateInitParams(
+ views::TrayBubbleView::InitParams* init_params) {
+ if (GetAnchorAlignment() == views::TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM) {
+ gfx::Point bounds(tray_container()->width() / 2, 0);
+ views::View::ConvertPointToWidget(tray_container(), &bounds);
+ init_params->arrow_offset = bounds.x();
+ }
+}
+
+void WebNotificationTray::OnMessageCenterTrayChanged() {
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- if (message_center_->UnreadNotificationCount() > 0) {
+ message_center::MessageCenter* message_center =
+ message_center_tray_->message_center();
+ if (message_center->UnreadNotificationCount() > 0) {
button_->SetImage(views::CustomButton::STATE_NORMAL, rb.GetImageSkiaNamed(
IDR_AURA_UBER_TRAY_NOTIFY_BUTTON_ACTIVE_NORMAL));
button_->SetImage(views::CustomButton::STATE_HOVERED, rb.GetImageSkiaNamed(
@@ -362,7 +266,7 @@ void WebNotificationTray::UpdateTray() {
button_->SetImage(views::CustomButton::STATE_PRESSED, rb.GetImageSkiaNamed(
IDR_AURA_UBER_TRAY_NOTIFY_BUTTON_INACTIVE_PRESSED));
}
- if (message_center_bubble())
+ if (message_center_visible_)
button_->SetState(views::CustomButton::STATE_PRESSED);
else
button_->SetState(views::CustomButton::STATE_NORMAL);
@@ -372,29 +276,19 @@ void WebNotificationTray::UpdateTray() {
bool WebNotificationTray::ClickedOutsideBubble() {
// Only hide the message center and quiet mode bubble.
- if (!message_center_bubble() && !quiet_mode_bubble())
+ if (!message_center_visible_ && !quiet_mode_bubble_.get())
return false;
quiet_mode_bubble_.reset();
- HideMessageCenterBubble();
+ message_center_tray_->HideMessageCenterBubble();
return true;
}
-// Methods for testing
-
-message_center::MessageCenterBubble*
-WebNotificationTray::GetMessageCenterBubbleForTest() {
- if (!message_center_bubble_.get())
- return NULL;
- return static_cast<message_center::MessageCenterBubble*>(
- message_center_bubble_->bubble());
+void WebNotificationTray::ShowMessageCenter() {
+ message_center_tray_->ShowMessageCenterBubble();
Pete Williamson 2013/01/16 19:43:20 We removed some testing methods, does that mean we
dewittj 2013/01/16 22:30:40 They were a work in progress. The patch you read
}
-message_center::MessagePopupBubble*
-WebNotificationTray::GetPopupBubbleForTest() {
- if (!popup_bubble_.get())
- return NULL;
- return static_cast<message_center::MessagePopupBubble*>(
- popup_bubble_->bubble());
+bool WebNotificationTray::IsPopupVisible() const {
+ return message_center_tray_->IsPopupVisible();
}
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698