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