Home | History | Annotate | Download | only in sync_notifier
      1 // Copyright (c) 2012 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 // This class represents the data for a single Synced Notification.
      6 // It should map 1-1 to all the data in synced_notification_sepcifics.proto,
      7 // and the data and render protobufs that the specifics protobuf contains.
      8 
      9 #ifndef CHROME_BROWSER_NOTIFICATIONS_SYNC_NOTIFIER_SYNCED_NOTIFICATION_H_
     10 #define CHROME_BROWSER_NOTIFICATIONS_SYNC_NOTIFIER_SYNCED_NOTIFICATION_H_
     11 
     12 #include <string>
     13 
     14 #include "base/gtest_prod_util.h"
     15 #include "base/memory/scoped_ptr.h"
     16 #include "base/memory/scoped_vector.h"
     17 #include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
     18 #include "sync/api/sync_data.h"
     19 #include "sync/protocol/sync.pb.h"
     20 #include "ui/gfx/image/image.h"
     21 #include "url/gurl.h"
     22 
     23 namespace sync_pb {
     24 class SyncedNotificationSpecifics;
     25 }
     26 
     27 class NotificationUIManager;
     28 class Profile;
     29 
     30 namespace notifier {
     31 
     32 class ChromeNotifierService;
     33 
     34 class SyncedNotification : public chrome::BitmapFetcherDelegate {
     35  public:
     36   SyncedNotification(const syncer::SyncData& sync_data,
     37                      ChromeNotifierService* notifier,
     38                      NotificationUIManager* notification_manager);
     39 
     40   virtual ~SyncedNotification();
     41 
     42   enum ReadState {
     43     kUnread = 1,
     44     kRead = 2,
     45     kDismissed = 3,
     46   };
     47 
     48   static const int kUndefinedPriority = 65535;
     49 
     50   void Update(const syncer::SyncData& sync_data);
     51 
     52   // Display the notification in the notification center
     53   void Show(Profile* profile);
     54 
     55   // This gets a pointer to the SyncedNotificationSpecifics part
     56   // of the sync data.
     57   sync_pb::EntitySpecifics GetEntitySpecifics() const;
     58 
     59   // Display the notification if it has the specified app_id_name.
     60   void ShowAllForAppId(Profile* profile,
     61                        std::string app_id_name);
     62 
     63   // Remove the notification if it has the specified app_id_name.
     64   void HideAllForAppId(std::string app_id_name);
     65 
     66   // Fill up the queue of bitmaps to fetch.
     67   void QueueBitmapFetchJobs(ChromeNotifierService* notifier_service,
     68                             Profile* profile);
     69 
     70   // Start the bitmap fetching.  When it is complete, the callback
     71   // will call Show().
     72   void StartBitmapFetch();
     73 
     74   // Check against an incoming notification, see if only the read state is
     75   // different.
     76   bool EqualsIgnoringReadState(const SyncedNotification& other) const;
     77 
     78   // Mark the notification as Read.
     79   void NotificationHasBeenRead();
     80 
     81   // Mark a notification as Dismissed (deleted).
     82   void NotificationHasBeenDismissed();
     83 
     84   // Here are some helper functions to get individual data parts out of a
     85   // SyncedNotification.
     86   std::string GetTitle() const;
     87   std::string GetHeading() const;
     88   std::string GetDescription() const;
     89   std::string GetAnnotation() const;
     90   std::string GetAppId() const;
     91   std::string GetKey() const;
     92   GURL GetOriginUrl() const;
     93   GURL GetAppIconUrl() const;
     94   GURL GetImageUrl() const;
     95   std::string GetText() const;
     96   ReadState GetReadState() const;
     97   uint64 GetCreationTime() const;
     98   int GetPriority() const;
     99   std::string GetDefaultDestinationTitle() const;
    100   GURL GetDefaultDestinationIconUrl() const;
    101   GURL GetDefaultDestinationUrl() const;
    102   std::string GetButtonTitle(unsigned int which_button) const;
    103   GURL GetButtonIconUrl(unsigned int which_button) const;
    104   GURL GetButtonUrl(unsigned int which_button) const;
    105   GURL GetProfilePictureUrl(unsigned int which_url) const;
    106   size_t GetProfilePictureCount() const;
    107   size_t GetNotificationCount() const;
    108   size_t GetButtonCount() const;
    109   std::string GetContainedNotificationTitle(int index) const;
    110   std::string GetContainedNotificationMessage(int index) const;
    111   const gfx::Image& GetAppIcon() const;
    112 
    113   // Use this to prevent toasting a notification.
    114   void set_toast_state(bool toast_state);
    115 
    116   // Write a notification to the console log.
    117   void LogNotification();
    118 
    119  private:
    120   // Method inherited from BitmapFetcher delegate.
    121   virtual void OnFetchComplete(const GURL url, const SkBitmap* bitmap) OVERRIDE;
    122 
    123   // If this bitmap has a valid GURL, create a fetcher for it.
    124   void CreateBitmapFetcher(const GURL& gurl);
    125 
    126   // Check to see if we have responses for all the bitmaps we need.
    127   bool AreAllBitmapsFetched();
    128 
    129   // Helper function to mark a notification as read or dismissed.
    130   void SetReadState(const ReadState& read_state);
    131 
    132   void SetNotifierServiceForTest(ChromeNotifierService* notifier) {
    133     notifier_service_ = notifier;
    134   }
    135 
    136   sync_pb::SyncedNotificationSpecifics specifics_;
    137   NotificationUIManager* notification_manager_;
    138   ChromeNotifierService* notifier_service_;
    139   Profile* profile_;
    140   bool toast_state_;
    141   ScopedVector<chrome::BitmapFetcher> fetchers_;
    142   gfx::Image app_icon_bitmap_;
    143   gfx::Image sender_bitmap_;
    144   gfx::Image image_bitmap_;
    145   std::vector<gfx::Image> button_bitmaps_;
    146   bool app_icon_bitmap_fetch_pending_;
    147   bool sender_bitmap_fetch_pending_;
    148   bool image_bitmap_fetch_pending_;
    149   std::vector<bool> button_bitmaps_fetch_pending_;
    150 
    151   friend class SyncedNotificationTest;
    152 
    153   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, CreateBitmapFetcherTest);
    154   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, OnFetchCompleteTest);
    155   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, QueueBitmapFetchJobsTest);
    156   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, EmptyBitmapTest);
    157   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, ShowIfNewlyEnabledTest);
    158   FRIEND_TEST_ALL_PREFIXES(SyncedNotificationTest, HideIfNewlyRemovedTest);
    159   FRIEND_TEST_ALL_PREFIXES(ChromeNotifierServiceTest, SetAddedAppIdsTest);
    160 
    161   DISALLOW_COPY_AND_ASSIGN(SyncedNotification);
    162 };
    163 
    164 }  // namespace notifier
    165 
    166 #endif  // CHROME_BROWSER_NOTIFICATIONS_SYNC_NOTIFIER_SYNCED_NOTIFICATION_H_
    167