blob: 7a1fee8d261ac74a0e5b47889300840f1807cb8d [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.
#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"
namespace message_center {
namespace {
// Menu commands
const int kToggleQuietMode = 0;
const int kEnableQuietModeHour = 1;
const int kEnableQuietModeDay = 2;
}
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;
HidePopupBubble();
message_center_visible_ = delegate_->ShowMessageCenter();
message_center_->SetMessageCenterVisible(message_center_visible_);
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;
message_center_->SetMessageCenterVisible(false);
// Some notifications (like system ones) should appear as popups again
// after the message center is closed.
if (message_center_->HasPopupNotifications())
ShowPopupBubble();
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;
delegate_->HidePopups();
popups_visible_ = false;
NotifyMessageCenterTrayChanged();
return true;
}
void MessageCenterTray::ShowNotifierSettingsBubble() {
if (popups_visible_)
HidePopupBubble();
message_center_visible_ = delegate_->ShowNotifierSettings();
}
ui::MenuModel* MessageCenterTray::CreateQuietModeMenu() {
ui::SimpleMenuModel* menu = new ui::SimpleMenuModel(this);
menu->AddCheckItem(kToggleQuietMode,
l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE));
menu->AddItem(kEnableQuietModeHour,
l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE_1HOUR));
menu->AddItem(kEnableQuietModeDay,
l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_QUIET_MODE_1DAY));
return menu;
}
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::OnMessageCenterChanged() {
if (message_center_visible_) {
if (message_center_->NotificationCount() == 0)
HideMessageCenterBubble();
}
if (popups_visible_ && !message_center_->HasPopupNotifications())
HidePopupBubble();
else if (message_center_->HasPopupNotifications())
ShowPopupBubble();
NotifyMessageCenterTrayChanged();
}
bool MessageCenterTray::IsCommandIdChecked(int command_id) const {
if (command_id != kToggleQuietMode)
return false;
return message_center()->IsQuietMode();
}
bool MessageCenterTray::IsCommandIdEnabled(int command_id) const {
return true;
}
bool MessageCenterTray::GetAcceleratorForCommandId(
int command_id,
ui::Accelerator* accelerator) {
return false;
}
void MessageCenterTray::ExecuteCommand(int command_id, int event_flags) {
if (command_id == kToggleQuietMode) {
bool in_quiet_mode = message_center()->IsQuietMode();
message_center()->SetQuietMode(!in_quiet_mode);
NotifyMessageCenterTrayChanged();
return;
}
base::TimeDelta expires_in = command_id == kEnableQuietModeDay ?
base::TimeDelta::FromDays(1):
base::TimeDelta::FromHours(1);
message_center()->EnterQuietModeWithExpire(expires_in);
NotifyMessageCenterTrayChanged();
}
void MessageCenterTray::NotifyMessageCenterTrayChanged() {
delegate_->OnMessageCenterTrayChanged();
}
} // namespace message_center