Home | History | Annotate | Download | only in message_center
      1 // Copyright 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 #ifndef CHROME_BROWSER_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_
      6 #define CHROME_BROWSER_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_
      7 
      8 #include "base/memory/weak_ptr.h"
      9 #include "base/prefs/pref_member.h"
     10 #include "chrome/browser/status_icons/status_icon_menu_model.h"
     11 #include "chrome/browser/status_icons/status_icon_observer.h"
     12 #include "chrome/browser/ui/views/message_center/message_center_widget_delegate.h"
     13 #include "content/public/browser/notification_observer.h"
     14 #include "content/public/browser/notification_registrar.h"
     15 #include "ui/base/models/simple_menu_model.h"
     16 #include "ui/gfx/rect.h"
     17 #include "ui/message_center/message_center_tray.h"
     18 #include "ui/message_center/message_center_tray_delegate.h"
     19 #include "ui/views/widget/widget_observer.h"
     20 
     21 #if defined(OS_WIN)
     22 #include "base/threading/thread.h"
     23 #endif
     24 
     25 class PrefService;
     26 class StatusIcon;
     27 
     28 namespace message_center {
     29 class MessageCenter;
     30 class MessagePopupCollection;
     31 }
     32 
     33 namespace views {
     34 class Widget;
     35 }
     36 
     37 namespace message_center {
     38 
     39 struct PositionInfo;
     40 
     41 class DesktopPopupAlignmentDelegate;
     42 class MessageCenterWidgetDelegate;
     43 
     44 // A MessageCenterTrayDelegate implementation that exposes the MessageCenterTray
     45 // via a system tray icon.  The notification popups will be displayed in the
     46 // corner of the screen and the message center will be displayed by the system
     47 // tray icon on click.
     48 class WebNotificationTray : public message_center::MessageCenterTrayDelegate,
     49                             public StatusIconObserver,
     50                             public base::SupportsWeakPtr<WebNotificationTray>,
     51                             public StatusIconMenuModel::Delegate {
     52  public:
     53   explicit WebNotificationTray(PrefService* local_state);
     54   virtual ~WebNotificationTray();
     55 
     56   message_center::MessageCenter* message_center();
     57 
     58   // MessageCenterTrayDelegate implementation.
     59   virtual bool ShowPopups() OVERRIDE;
     60   virtual void HidePopups() OVERRIDE;
     61   virtual bool ShowMessageCenter() OVERRIDE;
     62   virtual void HideMessageCenter() OVERRIDE;
     63   virtual void OnMessageCenterTrayChanged() OVERRIDE;
     64   virtual bool ShowNotifierSettings() OVERRIDE;
     65   virtual bool IsContextMenuEnabled() const OVERRIDE;
     66 
     67   // StatusIconObserver implementation.
     68   virtual void OnStatusIconClicked() OVERRIDE;
     69 #if defined(OS_WIN)
     70   virtual void OnBalloonClicked() OVERRIDE;
     71 
     72   // This shows a platform-specific balloon informing the user of the existence
     73   // of the message center in the status tray area.
     74   void DisplayFirstRunBalloon();
     75 
     76   void EnforceStatusIconVisible();
     77 #endif
     78 
     79   // StatusIconMenuModel::Delegate implementation.
     80   virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
     81 
     82   // Changes the icon and hovertext based on number of unread notifications.
     83   void UpdateStatusIcon();
     84   void SendHideMessageCenter();
     85   void MarkMessageCenterHidden();
     86 
     87   // Gets the point where the status icon was clicked.
     88   gfx::Point mouse_click_point() { return mouse_click_point_; }
     89   virtual MessageCenterTray* GetMessageCenterTray() OVERRIDE;
     90 
     91  private:
     92   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, WebNotifications);
     93   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, WebNotificationPopupBubble);
     94   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest,
     95                            ManyMessageCenterNotifications);
     96   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, ManyPopupNotifications);
     97   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, ManuallyCloseMessageCenter);
     98   FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, StatusIconBehavior);
     99 
    100   PositionInfo GetPositionInfo();
    101 
    102   void CreateStatusIcon(const gfx::ImageSkia& image,
    103                         const base::string16& tool_tip);
    104   void DestroyStatusIcon();
    105   void AddQuietModeMenu(StatusIcon* status_icon);
    106   MessageCenterWidgetDelegate* GetMessageCenterWidgetDelegateForTest();
    107 
    108 #if defined(OS_WIN)
    109   // This member variable keeps track of whether EnforceStatusIconVisible has
    110   // been invoked on this machine, so the user still has control after we try
    111   // promoting it the first time.
    112   scoped_ptr<BooleanPrefMember> did_force_tray_visible_;
    113 #endif
    114 
    115   MessageCenterWidgetDelegate* message_center_delegate_;
    116   scoped_ptr<message_center::MessagePopupCollection> popup_collection_;
    117   scoped_ptr<message_center::DesktopPopupAlignmentDelegate> alignment_delegate_;
    118 
    119   StatusIcon* status_icon_;
    120   StatusIconMenuModel* status_icon_menu_;
    121   scoped_ptr<MessageCenterTray> message_center_tray_;
    122   gfx::Point mouse_click_point_;
    123 
    124   bool should_update_tray_content_;
    125   bool last_quiet_mode_state_;
    126   base::string16 title_;
    127 
    128   DISALLOW_COPY_AND_ASSIGN(WebNotificationTray);
    129 };
    130 
    131 }  // namespace message_center
    132 
    133 #endif  // CHROME_BROWSER_UI_VIEWS_MESSAGE_CENTER_WEB_NOTIFICATION_TRAY_H_
    134