| // 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. |
| |
| #include "ui/message_center/message_center_tray.h" |
| |
| #include "base/observer_list.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "grit/ui_strings.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/message_center/message_center.h" |
| #include "ui/message_center/message_center_tray_delegate.h" |
| #include "ui/message_center/message_center_types.h" |
| |
| namespace message_center { |
| |
| MessageCenterTray::MessageCenterTray( |
| MessageCenterTrayDelegate* delegate, |
| message_center::MessageCenter* message_center) |
| : message_center_(message_center), |
| message_center_visible_(false), |
| popups_visible_(false), |
| delegate_(delegate) { |
| message_center_->AddObserver(this); |
| } |
| |
| MessageCenterTray::~MessageCenterTray() { |
| message_center_->RemoveObserver(this); |
| } |
| |
| bool MessageCenterTray::ShowMessageCenterBubble() { |
| if (message_center_visible_) |
| return true; |
| |
| HidePopupBubbleInternal(); |
| |
| message_center_visible_ = delegate_->ShowMessageCenter(); |
| message_center_->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER); |
| NotifyMessageCenterTrayChanged(); |
| return message_center_visible_; |
| } |
| |
| bool MessageCenterTray::HideMessageCenterBubble() { |
| if (!message_center_visible_) |
| return false; |
| delegate_->HideMessageCenter(); |
| MarkMessageCenterHidden(); |
| return true; |
| } |
| |
| void MessageCenterTray::MarkMessageCenterHidden() { |
| if (!message_center_visible_) |
| return; |
| message_center_visible_ = false; |
| |
| // Some notifications (like system ones) should appear as popups again |
| // after the message center is closed. |
| if (message_center_->HasPopupNotifications()) { |
| ShowPopupBubble(); |
| return; |
| } |
| |
| message_center_->SetVisibility(message_center::VISIBILITY_TRANSIENT); |
| |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| void MessageCenterTray::ToggleMessageCenterBubble() { |
| if (message_center_visible_) |
| HideMessageCenterBubble(); |
| else |
| ShowMessageCenterBubble(); |
| } |
| |
| void MessageCenterTray::ShowPopupBubble() { |
| if (message_center_visible_) |
| return; |
| |
| if (popups_visible_) { |
| NotifyMessageCenterTrayChanged(); |
| return; |
| } |
| |
| if (!message_center_->HasPopupNotifications()) |
| return; |
| |
| popups_visible_ = delegate_->ShowPopups(); |
| |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| bool MessageCenterTray::HidePopupBubble() { |
| if (!popups_visible_) |
| return false; |
| HidePopupBubbleInternal(); |
| NotifyMessageCenterTrayChanged(); |
| |
| return true; |
| } |
| |
| void MessageCenterTray::HidePopupBubbleInternal() { |
| if (!popups_visible_) |
| return; |
| |
| delegate_->HidePopups(); |
| popups_visible_ = false; |
| } |
| |
| void MessageCenterTray::ShowNotifierSettingsBubble() { |
| if (popups_visible_) |
| HidePopupBubbleInternal(); |
| |
| message_center_visible_ = delegate_->ShowNotifierSettings(); |
| message_center_->SetVisibility(message_center::VISIBILITY_SETTINGS); |
| |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationAdded( |
| const std::string& notification_id) { |
| OnMessageCenterChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationRemoved( |
| const std::string& notification_id, |
| bool by_user) { |
| OnMessageCenterChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationUpdated( |
| const std::string& notification_id) { |
| OnMessageCenterChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationClicked( |
| const std::string& notification_id) { |
| if (popups_visible_) |
| OnMessageCenterChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationButtonClicked( |
| const std::string& notification_id, |
| int button_index) { |
| if (popups_visible_) |
| OnMessageCenterChanged(); |
| } |
| |
| void MessageCenterTray::OnNotificationDisplayed( |
| const std::string& notification_id) { |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| void MessageCenterTray::OnQuietModeChanged(bool in_quiet_mode) { |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| void MessageCenterTray::OnMessageCenterChanged() { |
| if (message_center_visible_ && message_center_->NotificationCount() == 0) |
| HideMessageCenterBubble(); |
| |
| if (popups_visible_ && !message_center_->HasPopupNotifications()) |
| HidePopupBubbleInternal(); |
| else if (!popups_visible_ && message_center_->HasPopupNotifications()) |
| ShowPopupBubble(); |
| |
| NotifyMessageCenterTrayChanged(); |
| } |
| |
| void MessageCenterTray::NotifyMessageCenterTrayChanged() { |
| delegate_->OnMessageCenterTrayChanged(); |
| } |
| |
| } // namespace message_center |