1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/message_center/message_center_tray.h"
6
7 #include "base/observer_list.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "ui/base/l10n/l10n_util.h"
10 #include "ui/base/models/simple_menu_model.h"
11 #include "ui/message_center/message_center.h"
12 #include "ui/message_center/message_center_tray_delegate.h"
13 #include "ui/message_center/message_center_types.h"
14 #include "ui/message_center/notification_blocker.h"
15 #include "ui/strings/grit/ui_strings.h"
16
17 namespace message_center {
18
19 namespace {
20
21 // Menu constants
22 const int kTogglePermissionCommand = 0;
23 const int kShowSettingsCommand = 1;
24
25 // The model of the context menu for a notification card.
26 class NotificationMenuModel : public ui::SimpleMenuModel,
27 public ui::SimpleMenuModel::Delegate {
28 public:
29 NotificationMenuModel(MessageCenterTray* tray,
30 const NotifierId& notifier_id,
31 const base::string16& display_source);
32 virtual ~NotificationMenuModel();
33
34 // Overridden from ui::SimpleMenuModel::Delegate:
35 virtual bool IsCommandIdChecked(int command_id) const OVERRIDE;
36 virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE;
37 virtual bool GetAcceleratorForCommandId(
38 int command_id,
39 ui::Accelerator* accelerator) OVERRIDE;
40 virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
41
42 private:
43 MessageCenterTray* tray_;
44 NotifierId notifier_id_;
45 DISALLOW_COPY_AND_ASSIGN(NotificationMenuModel);
46 };
47
NotificationMenuModel(MessageCenterTray * tray,const NotifierId & notifier_id,const base::string16 & display_source)48 NotificationMenuModel::NotificationMenuModel(
49 MessageCenterTray* tray,
50 const NotifierId& notifier_id,
51 const base::string16& display_source)
52 : ui::SimpleMenuModel(this),
53 tray_(tray),
54 notifier_id_(notifier_id) {
55 // Add 'disable notifications' menu item.
56 if (!display_source.empty()) {
57 AddItem(kTogglePermissionCommand,
58 l10n_util::GetStringFUTF16(IDS_MESSAGE_CENTER_NOTIFIER_DISABLE,
59 display_source));
60 }
61 // Add settings menu item.
62 AddItem(kShowSettingsCommand,
63 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS));
64 }
65
~NotificationMenuModel()66 NotificationMenuModel::~NotificationMenuModel() {
67 }
68
IsCommandIdChecked(int command_id) const69 bool NotificationMenuModel::IsCommandIdChecked(int command_id) const {
70 return false;
71 }
72
IsCommandIdEnabled(int command_id) const73 bool NotificationMenuModel::IsCommandIdEnabled(int command_id) const {
74 return tray_->delegate()->IsContextMenuEnabled();
75 }
76
GetAcceleratorForCommandId(int command_id,ui::Accelerator * accelerator)77 bool NotificationMenuModel::GetAcceleratorForCommandId(
78 int command_id,
79 ui::Accelerator* accelerator) {
80 return false;
81 }
82
ExecuteCommand(int command_id,int event_flags)83 void NotificationMenuModel::ExecuteCommand(int command_id, int event_flags) {
84 switch (command_id) {
85 case kTogglePermissionCommand:
86 tray_->message_center()->DisableNotificationsByNotifier(notifier_id_);
87 break;
88 case kShowSettingsCommand:
89 tray_->ShowNotifierSettingsBubble();
90 break;
91 default:
92 NOTREACHED();
93 }
94 }
95
96 } // namespace
97
MessageCenterTray(MessageCenterTrayDelegate * delegate,message_center::MessageCenter * message_center)98 MessageCenterTray::MessageCenterTray(
99 MessageCenterTrayDelegate* delegate,
100 message_center::MessageCenter* message_center)
101 : message_center_(message_center),
102 message_center_visible_(false),
103 popups_visible_(false),
104 delegate_(delegate) {
105 message_center_->AddObserver(this);
106 }
107
~MessageCenterTray()108 MessageCenterTray::~MessageCenterTray() {
109 message_center_->RemoveObserver(this);
110 }
111
ShowMessageCenterBubble()112 bool MessageCenterTray::ShowMessageCenterBubble() {
113 if (message_center_visible_)
114 return true;
115
116 HidePopupBubbleInternal();
117
118 message_center_visible_ = delegate_->ShowMessageCenter();
119 message_center_->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
120 NotifyMessageCenterTrayChanged();
121 return message_center_visible_;
122 }
123
HideMessageCenterBubble()124 bool MessageCenterTray::HideMessageCenterBubble() {
125 if (!message_center_visible_)
126 return false;
127 delegate_->HideMessageCenter();
128 MarkMessageCenterHidden();
129 return true;
130 }
131
MarkMessageCenterHidden()132 void MessageCenterTray::MarkMessageCenterHidden() {
133 if (!message_center_visible_)
134 return;
135 message_center_visible_ = false;
136 message_center_->SetVisibility(message_center::VISIBILITY_TRANSIENT);
137
138 // Some notifications (like system ones) should appear as popups again
139 // after the message center is closed.
140 if (message_center_->HasPopupNotifications()) {
141 ShowPopupBubble();
142 return;
143 }
144
145 NotifyMessageCenterTrayChanged();
146 }
147
ToggleMessageCenterBubble()148 void MessageCenterTray::ToggleMessageCenterBubble() {
149 if (message_center_visible_)
150 HideMessageCenterBubble();
151 else
152 ShowMessageCenterBubble();
153 }
154
ShowPopupBubble()155 void MessageCenterTray::ShowPopupBubble() {
156 if (message_center_visible_)
157 return;
158
159 if (popups_visible_) {
160 NotifyMessageCenterTrayChanged();
161 return;
162 }
163
164 if (!message_center_->HasPopupNotifications())
165 return;
166
167 popups_visible_ = delegate_->ShowPopups();
168
169 NotifyMessageCenterTrayChanged();
170 }
171
HidePopupBubble()172 bool MessageCenterTray::HidePopupBubble() {
173 if (!popups_visible_)
174 return false;
175 HidePopupBubbleInternal();
176 NotifyMessageCenterTrayChanged();
177
178 return true;
179 }
180
HidePopupBubbleInternal()181 void MessageCenterTray::HidePopupBubbleInternal() {
182 if (!popups_visible_)
183 return;
184
185 delegate_->HidePopups();
186 popups_visible_ = false;
187 }
188
ShowNotifierSettingsBubble()189 void MessageCenterTray::ShowNotifierSettingsBubble() {
190 if (popups_visible_)
191 HidePopupBubbleInternal();
192
193 message_center_visible_ = delegate_->ShowNotifierSettings();
194 message_center_->SetVisibility(message_center::VISIBILITY_SETTINGS);
195
196 NotifyMessageCenterTrayChanged();
197 }
198
CreateNotificationMenuModel(const NotifierId & notifier_id,const base::string16 & display_source)199 scoped_ptr<ui::MenuModel> MessageCenterTray::CreateNotificationMenuModel(
200 const NotifierId& notifier_id,
201 const base::string16& display_source) {
202 return scoped_ptr<ui::MenuModel>(new NotificationMenuModel(
203 this, notifier_id, display_source));
204 }
205
OnNotificationAdded(const std::string & notification_id)206 void MessageCenterTray::OnNotificationAdded(
207 const std::string& notification_id) {
208 OnMessageCenterChanged();
209 }
210
OnNotificationRemoved(const std::string & notification_id,bool by_user)211 void MessageCenterTray::OnNotificationRemoved(
212 const std::string& notification_id,
213 bool by_user) {
214 OnMessageCenterChanged();
215 }
216
OnNotificationUpdated(const std::string & notification_id)217 void MessageCenterTray::OnNotificationUpdated(
218 const std::string& notification_id) {
219 OnMessageCenterChanged();
220 }
221
OnNotificationClicked(const std::string & notification_id)222 void MessageCenterTray::OnNotificationClicked(
223 const std::string& notification_id) {
224 if (popups_visible_)
225 OnMessageCenterChanged();
226 }
227
OnNotificationButtonClicked(const std::string & notification_id,int button_index)228 void MessageCenterTray::OnNotificationButtonClicked(
229 const std::string& notification_id,
230 int button_index) {
231 if (popups_visible_)
232 OnMessageCenterChanged();
233 }
234
OnNotificationDisplayed(const std::string & notification_id,const DisplaySource source)235 void MessageCenterTray::OnNotificationDisplayed(
236 const std::string& notification_id,
237 const DisplaySource source) {
238 NotifyMessageCenterTrayChanged();
239 }
240
OnQuietModeChanged(bool in_quiet_mode)241 void MessageCenterTray::OnQuietModeChanged(bool in_quiet_mode) {
242 NotifyMessageCenterTrayChanged();
243 }
244
OnBlockingStateChanged(NotificationBlocker * blocker)245 void MessageCenterTray::OnBlockingStateChanged(NotificationBlocker* blocker) {
246 OnMessageCenterChanged();
247 }
248
OnMessageCenterChanged()249 void MessageCenterTray::OnMessageCenterChanged() {
250 if (message_center_visible_ && message_center_->NotificationCount() == 0)
251 HideMessageCenterBubble();
252
253 if (popups_visible_ && !message_center_->HasPopupNotifications())
254 HidePopupBubbleInternal();
255 else if (!popups_visible_ && message_center_->HasPopupNotifications())
256 ShowPopupBubble();
257
258 NotifyMessageCenterTrayChanged();
259 }
260
NotifyMessageCenterTrayChanged()261 void MessageCenterTray::NotifyMessageCenterTrayChanged() {
262 delegate_->OnMessageCenterTrayChanged();
263 }
264
265 } // namespace message_center
266