Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3264)

Unified Diff: chrome/browser/notifications/sync_notifier/synced_notification.cc

Issue 193773003: Turn on and use the AppInfo data. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Turn on app info: LGTM nits Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/notifications/sync_notifier/synced_notification.cc
diff --git a/chrome/browser/notifications/sync_notifier/synced_notification.cc b/chrome/browser/notifications/sync_notifier/synced_notification.cc
index cddced0d0dc35641cf3f0664cc7febacee87e3db..a7425630b9797cc3ae29dcf1a74d795e1dbb5939 100644
--- a/chrome/browser/notifications/sync_notifier/synced_notification.cc
+++ b/chrome/browser/notifications/sync_notifier/synced_notification.cc
@@ -68,9 +68,12 @@ COMPILE_ASSERT(static_cast<sync_pb::CoalescedSyncedNotification_ReadState>(
sync_pb::CoalescedSyncedNotification_ReadState_DISMISSED,
local_enum_must_match_protobuf_enum);
-SyncedNotification::SyncedNotification(const syncer::SyncData& sync_data)
- : notification_manager_(NULL),
- notifier_service_(NULL),
+SyncedNotification::SyncedNotification(
+ const syncer::SyncData& sync_data,
+ ChromeNotifierService* notifier_service,
+ NotificationUIManager* notification_manager)
+ : notification_manager_(notification_manager),
+ notifier_service_(notifier_service),
profile_(NULL),
toast_state_(true),
app_icon_bitmap_fetch_pending_(true),
@@ -86,166 +89,19 @@ void SyncedNotification::Update(const syncer::SyncData& sync_data) {
specifics_.CopyFrom(sync_data.GetSpecifics().synced_notification());
}
-sync_pb::EntitySpecifics SyncedNotification::GetEntitySpecifics() const {
- sync_pb::EntitySpecifics entity_specifics;
- entity_specifics.mutable_synced_notification()->CopyFrom(specifics_);
- return entity_specifics;
-}
-
-// Check that we have either fetched or gotten an error on all the bitmaps we
-// asked for.
-bool SyncedNotification::AreAllBitmapsFetched() {
- bool app_icon_ready = GetAppIconUrl().is_empty() ||
- !app_icon_bitmap_.IsEmpty() || !app_icon_bitmap_fetch_pending_;
- bool images_ready = GetImageUrl().is_empty() || !image_bitmap_.IsEmpty() ||
- !image_bitmap_fetch_pending_;
- bool sender_picture_ready = GetProfilePictureUrl(0).is_empty() ||
- !sender_bitmap_.IsEmpty() || !sender_bitmap_fetch_pending_;
- bool button_bitmaps_ready = true;
- for (unsigned int j = 0; j < GetButtonCount(); ++j) {
- if (!GetButtonIconUrl(j).is_empty()
- && button_bitmaps_[j].IsEmpty()
- && button_bitmaps_fetch_pending_[j]) {
- button_bitmaps_ready = false;
- break;
- }
- }
-
- return app_icon_ready && images_ready && sender_picture_ready &&
- button_bitmaps_ready;
-}
-
-// TODO(petewil): The fetch mechanism appears to be returning two bitmaps on the
-// mac - perhaps one is regular, one is high dpi? If so, ensure we use the high
-// dpi bitmap when appropriate.
-void SyncedNotification::OnFetchComplete(const GURL url,
- const SkBitmap* bitmap) {
- // TODO(petewil): Add timeout mechanism in case bitmaps take too long. Do we
- // already have one built into URLFetcher?
- // Make sure we are on the thread we expect.
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-
- gfx::Image downloaded_image;
- if (bitmap != NULL)
- downloaded_image = gfx::Image::CreateFrom1xBitmap(*bitmap);
-
- // Match the incoming bitmaps to URLs. In case this is a dup, make sure to
- // try all potentially matching urls.
- if (GetAppIconUrl() == url) {
- app_icon_bitmap_ = downloaded_image;
- if (app_icon_bitmap_.IsEmpty())
- app_icon_bitmap_fetch_pending_ = false;
- }
- if (GetImageUrl() == url) {
- image_bitmap_ = downloaded_image;
- if (image_bitmap_.IsEmpty())
- image_bitmap_fetch_pending_ = false;
- }
- if (GetProfilePictureUrl(0) == url) {
- sender_bitmap_ = downloaded_image;
- if (sender_bitmap_.IsEmpty())
- sender_bitmap_fetch_pending_ = false;
- }
-
- // If this URL matches one or more button bitmaps, save them off.
- for (unsigned int i = 0; i < GetButtonCount(); ++i) {
- if (GetButtonIconUrl(i) == url) {
- if (bitmap != NULL) {
- button_bitmaps_[i] = gfx::Image::CreateFrom1xBitmap(*bitmap);
- }
- button_bitmaps_fetch_pending_[i] = false;
- }
- }
-
- DVLOG(2) << __FUNCTION__ << " popping bitmap " << url;
-
- // See if all bitmaps are already accounted for, if so call Show.
- if (AreAllBitmapsFetched()) {
- Show(notification_manager_, notifier_service_, profile_);
- }
-}
-
-void SyncedNotification::QueueBitmapFetchJobs(
- NotificationUIManager* notification_manager,
- ChromeNotifierService* notifier_service,
- Profile* profile) {
- // If we are not using the MessageCenter, call show now, and the existing
- // code will handle the bitmap fetch for us.
- if (!UseRichNotifications()) {
- Show(notification_manager, notifier_service, profile);
- return;
- }
-
- // Save off the arguments for the call to Show.
- notification_manager_ = notification_manager;
- notifier_service_ = notifier_service;
- profile_ = profile;
-
- // Ensure our bitmap vector has as many entries as there are buttons,
- // so that when the bitmaps arrive the vector has a slot for them.
- for (unsigned int i = 0; i < GetButtonCount(); ++i) {
- button_bitmaps_.push_back(gfx::Image());
- button_bitmaps_fetch_pending_.push_back(true);
- AddBitmapToFetchQueue(GetButtonIconUrl(i));
- }
-
- // If there is a profile image bitmap, fetch it
- if (GetProfilePictureCount() > 0) {
- // TODO(petewil): When we have the capacity to display more than one bitmap,
- // modify this code to fetch as many as we can display
- AddBitmapToFetchQueue(GetProfilePictureUrl(0));
- }
-
- // If the URL is non-empty, add it to our queue of URLs to fetch.
- AddBitmapToFetchQueue(GetAppIconUrl());
- AddBitmapToFetchQueue(GetImageUrl());
-
- // Check to see if we don't need to fetch images, either because we already
- // did, or because the URLs are empty. If so, we can display the notification.
-
- // See if all bitmaps are accounted for, if so call Show().
- if (AreAllBitmapsFetched()) {
- Show(notification_manager_, notifier_service_, profile_);
- }
-}
-
-void SyncedNotification::StartBitmapFetch() {
- // Now that we have queued and counted them all, start the fetching.
- ScopedVector<chrome::BitmapFetcher>::iterator iter;
- for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
- (*iter)->Start(profile_);
- }
-}
-
-void SyncedNotification::AddBitmapToFetchQueue(const GURL& url) {
- // Check for dups, ignore any request for a dup.
- ScopedVector<chrome::BitmapFetcher>::iterator iter;
- for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
- if ((*iter)->url() == url)
- return;
- }
-
- if (url.is_valid()) {
- fetchers_.push_back(new chrome::BitmapFetcher(url, this));
- DVLOG(2) << __FUNCTION__ << "Pushing bitmap " << url;
- }
-}
-
-void SyncedNotification::Show(NotificationUIManager* notification_manager,
- ChromeNotifierService* notifier_service,
- Profile* profile) {
+void SyncedNotification::Show(Profile* profile) {
// Let NotificationUIManager know that the notification has been dismissed.
if (SyncedNotification::kRead == GetReadState() ||
SyncedNotification::kDismissed == GetReadState() ) {
- notification_manager->CancelById(GetKey());
+ notification_manager_->CancelById(GetKey());
DVLOG(2) << "Dismissed or read notification arrived"
<< GetHeading() << " " << GetText();
return;
}
// |notifier_service| can be NULL in tests.
- if (UseRichNotifications() && notifier_service) {
- notifier_service->ShowWelcomeToastIfNecessary(this, notification_manager);
+ if (UseRichNotifications() && notifier_service_) {
+ notifier_service_->ShowWelcomeToastIfNecessary(this, notification_manager_);
}
// Set up the fields we need to send and create a Notification object.
@@ -264,7 +120,7 @@ void SyncedNotification::Show(NotificationUIManager* notification_manager,
// The delegate will eventually catch calls that the notification
// was read or deleted, and send the changes back to the server.
scoped_refptr<NotificationDelegate> delegate =
- new ChromeNotifierDelegate(GetKey(), notifier_service);
+ new ChromeNotifierDelegate(GetKey(), notifier_service_);
// Some inputs and fields are only used if there is a notification center.
if (UseRichNotifications()) {
@@ -364,7 +220,7 @@ void SyncedNotification::Show(NotificationUIManager* notification_manager,
// has already been shown.
ui_notification.set_shown_as_popup(!toast_state_);
- notification_manager->Add(ui_notification, profile);
+ notification_manager_->Add(ui_notification, profile);
} else {
// In this case we have a Webkit Notification, not a Rich Notification.
Notification ui_notification(GetOriginUrl(),
@@ -376,7 +232,7 @@ void SyncedNotification::Show(NotificationUIManager* notification_manager,
replace_key,
delegate.get());
- notification_manager->Add(ui_notification, profile);
+ notification_manager_->Add(ui_notification, profile);
}
DVLOG(1) << "Showing Synced Notification! " << heading << " " << text
@@ -386,6 +242,76 @@ void SyncedNotification::Show(NotificationUIManager* notification_manager,
return;
}
+sync_pb::EntitySpecifics SyncedNotification::GetEntitySpecifics() const {
+ sync_pb::EntitySpecifics entity_specifics;
+ entity_specifics.mutable_synced_notification()->CopyFrom(specifics_);
+ return entity_specifics;
+}
+
+// Display the notification if it has the specified app_id_name.
+void SyncedNotification::ShowAllForAppId(Profile* profile,
+ std::string app_id_name) {
+ if (app_id_name == GetAppId())
+ Show(profile);
+}
+
+// Remove the notification if it has the specified app_id_name.
+void SyncedNotification::HideAllForAppId(std::string app_id_name) {
+ if (app_id_name == GetAppId()) {
+ notification_manager_->CancelById(GetKey());
+ }
+}
+
+void SyncedNotification::QueueBitmapFetchJobs(
+ ChromeNotifierService* notifier_service,
+ Profile* profile) {
+ // If we are not using the MessageCenter, call show now, and the existing
+ // code will handle the bitmap fetch for us.
+ if (!UseRichNotifications()) {
+ Show(profile);
+ return;
+ }
+
+ // Save off the arguments for the call to Show.
+ notifier_service_ = notifier_service;
+ profile_ = profile;
+
+ // Ensure our bitmap vector has as many entries as there are buttons,
+ // so that when the bitmaps arrive the vector has a slot for them.
+ for (unsigned int i = 0; i < GetButtonCount(); ++i) {
+ button_bitmaps_.push_back(gfx::Image());
+ button_bitmaps_fetch_pending_.push_back(true);
+ CreateBitmapFetcher(GetButtonIconUrl(i));
+ }
+
+ // If there is a profile image bitmap, fetch it
+ if (GetProfilePictureCount() > 0) {
+ // TODO(petewil): When we have the capacity to display more than one bitmap,
+ // modify this code to fetch as many as we can display
+ CreateBitmapFetcher(GetProfilePictureUrl(0));
+ }
+
+ // If the URL is non-empty, add it to our queue of URLs to fetch.
+ CreateBitmapFetcher(GetAppIconUrl());
+ CreateBitmapFetcher(GetImageUrl());
+
+ // Check to see if we don't need to fetch images, either because we already
+ // did, or because the URLs are empty. If so, we can display the notification.
+
+ // See if all bitmaps are accounted for, if so call Show().
+ if (AreAllBitmapsFetched()) {
+ Show(profile_);
+ }
+}
+
+void SyncedNotification::StartBitmapFetch() {
+ // Now that we have queued and counted them all, start the fetching.
+ ScopedVector<chrome::BitmapFetcher>::iterator iter;
+ for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
+ (*iter)->Start(profile_);
+ }
+}
+
// This should detect even small changes in case the server updated the
// notification. We ignore the timestamp if other fields match.
bool SyncedNotification::EqualsIgnoringReadState(
@@ -444,36 +370,6 @@ bool SyncedNotification::EqualsIgnoringReadState(
return false;
}
-void SyncedNotification::LogNotification() {
- std::string readStateString("Unread");
- if (SyncedNotification::kRead == GetReadState())
- readStateString = "Read";
- else if (SyncedNotification::kDismissed == GetReadState())
- readStateString = "Dismissed";
-
- DVLOG(2) << " Notification: Heading is " << GetHeading()
- << " description is " << GetDescription()
- << " key is " << GetKey()
- << " read state is " << readStateString;
-}
-
-// Set the read state on the notification, returns true for success.
-void SyncedNotification::SetReadState(const ReadState& read_state) {
-
- // Convert the read state to the protobuf type for read state.
- if (kDismissed == read_state)
- specifics_.mutable_coalesced_notification()->set_read_state(
- sync_pb::CoalescedSyncedNotification_ReadState_DISMISSED);
- else if (kUnread == read_state)
- specifics_.mutable_coalesced_notification()->set_read_state(
- sync_pb::CoalescedSyncedNotification_ReadState_UNREAD);
- else if (kRead == read_state)
- specifics_.mutable_coalesced_notification()->set_read_state(
- sync_pb::CoalescedSyncedNotification_ReadState_READ);
- else
- NOTREACHED();
-}
-
void SyncedNotification::NotificationHasBeenRead() {
SetReadState(kRead);
}
@@ -627,33 +523,6 @@ int SyncedNotification::GetPriority() const {
}
}
-size_t SyncedNotification::GetNotificationCount() const {
- return specifics_.coalesced_notification().render_info().
- expanded_info().collapsed_info_size();
-}
-
-size_t SyncedNotification::GetButtonCount() const {
- return specifics_.coalesced_notification().render_info().collapsed_info().
- target_size();
-}
-
-size_t SyncedNotification::GetProfilePictureCount() const {
- return specifics_.coalesced_notification().render_info().collapsed_info().
- simple_collapsed_layout().profile_image_size();
-}
-
-GURL SyncedNotification::GetProfilePictureUrl(unsigned int which_url) const {
- if (GetProfilePictureCount() <= which_url)
- return GURL();
-
- std::string url_spec = specifics_.coalesced_notification().render_info().
- collapsed_info().simple_collapsed_layout().profile_image(which_url).
- image_url();
-
- return AddDefaultSchemaIfNeeded(url_spec);
-}
-
-
std::string SyncedNotification::GetDefaultDestinationTitle() const {
if (!specifics_.coalesced_notification().render_info().collapsed_info().
default_destination().icon().has_alt_text()) {
@@ -726,6 +595,31 @@ GURL SyncedNotification::GetButtonUrl(unsigned int which_button) const {
return AddDefaultSchemaIfNeeded(url_spec);
}
+GURL SyncedNotification::GetProfilePictureUrl(unsigned int which_url) const {
+ if (GetProfilePictureCount() <= which_url)
+ return GURL();
+
+ std::string url_spec = specifics_.coalesced_notification().render_info().
+ collapsed_info().simple_collapsed_layout().profile_image(which_url).
+ image_url();
+
+ return AddDefaultSchemaIfNeeded(url_spec);
+}
+
+size_t SyncedNotification::GetProfilePictureCount() const {
+ return specifics_.coalesced_notification().render_info().collapsed_info().
+ simple_collapsed_layout().profile_image_size();
+}
+
+size_t SyncedNotification::GetNotificationCount() const {
+ return specifics_.coalesced_notification().render_info().
+ expanded_info().collapsed_info_size();
+}
+
+size_t SyncedNotification::GetButtonCount() const {
+ return specifics_.coalesced_notification().render_info().collapsed_info().
+ target_size();
+}
std::string SyncedNotification::GetContainedNotificationTitle(
int index) const {
if (specifics_.coalesced_notification().render_info().expanded_info().
@@ -746,20 +640,127 @@ std::string SyncedNotification::GetContainedNotificationMessage(
collapsed_info(index).simple_collapsed_layout().description();
}
-std::string SyncedNotification::GetSendingServiceId() const {
- // TODO(petewil): We are building a new protocol (a new sync datatype) to send
- // the service name and icon from the server. For now this method is
- // hardcoded to the name of our first service using synced notifications.
- // Once the new protocol is built, remove this hardcoding.
- return kFirstSyncedNotificationServiceId;
-}
-
const gfx::Image& SyncedNotification::GetAppIcon() const {
return app_icon_bitmap_;
}
-void SyncedNotification::SetToastState(bool toast_state) {
+void SyncedNotification::set_toast_state(bool toast_state) {
toast_state_ = toast_state;
}
+void SyncedNotification::LogNotification() {
+ std::string readStateString("Unread");
+ if (SyncedNotification::kRead == GetReadState())
+ readStateString = "Read";
+ else if (SyncedNotification::kDismissed == GetReadState())
+ readStateString = "Dismissed";
+
+ DVLOG(2) << " Notification: Heading is " << GetHeading()
+ << " description is " << GetDescription()
+ << " key is " << GetKey()
+ << " read state is " << readStateString;
+}
+
+// TODO(petewil): The fetch mechanism appears to be returning two bitmaps on the
+// mac - perhaps one is regular, one is high dpi? If so, ensure we use the high
+// dpi bitmap when appropriate.
+void SyncedNotification::OnFetchComplete(const GURL url,
+ const SkBitmap* bitmap) {
+ // Make sure we are on the thread we expect.
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+
+ gfx::Image downloaded_image;
+ if (bitmap != NULL)
+ downloaded_image = gfx::Image::CreateFrom1xBitmap(*bitmap);
+
+ // Match the incoming bitmaps to URLs. In case this is a dup, make sure to
+ // try all potentially matching urls.
+ if (GetAppIconUrl() == url) {
+ app_icon_bitmap_ = downloaded_image;
+ if (app_icon_bitmap_.IsEmpty())
+ app_icon_bitmap_fetch_pending_ = false;
+ }
+ if (GetImageUrl() == url) {
+ image_bitmap_ = downloaded_image;
+ if (image_bitmap_.IsEmpty())
+ image_bitmap_fetch_pending_ = false;
+ }
+ if (GetProfilePictureUrl(0) == url) {
+ sender_bitmap_ = downloaded_image;
+ if (sender_bitmap_.IsEmpty())
+ sender_bitmap_fetch_pending_ = false;
+ }
+
+ // If this URL matches one or more button bitmaps, save them off.
+ for (unsigned int i = 0; i < GetButtonCount(); ++i) {
+ if (GetButtonIconUrl(i) == url) {
+ if (bitmap != NULL) {
+ button_bitmaps_[i] = gfx::Image::CreateFrom1xBitmap(*bitmap);
+ }
+ button_bitmaps_fetch_pending_[i] = false;
+ }
+ }
+
+ DVLOG(2) << __FUNCTION__ << " popping bitmap " << url;
+
+ // See if all bitmaps are already accounted for, if so call Show.
+ if (AreAllBitmapsFetched()) {
+ Show(profile_);
+ }
+}
+
+void SyncedNotification::CreateBitmapFetcher(const GURL& url) {
+ // Check for dups, ignore any request for a dup.
+ ScopedVector<chrome::BitmapFetcher>::iterator iter;
+ for (iter = fetchers_.begin(); iter != fetchers_.end(); ++iter) {
+ if ((*iter)->url() == url)
+ return;
+ }
+
+ if (url.is_valid()) {
+ fetchers_.push_back(new chrome::BitmapFetcher(url, this));
+ DVLOG(2) << __FUNCTION__ << "Pushing bitmap " << url;
+ }
+}
+
+// Check that we have either fetched or gotten an error on all the bitmaps we
+// asked for.
+bool SyncedNotification::AreAllBitmapsFetched() {
+ bool app_icon_ready = GetAppIconUrl().is_empty() ||
+ !app_icon_bitmap_.IsEmpty() || !app_icon_bitmap_fetch_pending_;
+ bool images_ready = GetImageUrl().is_empty() || !image_bitmap_.IsEmpty() ||
+ !image_bitmap_fetch_pending_;
+ bool sender_picture_ready = GetProfilePictureUrl(0).is_empty() ||
+ !sender_bitmap_.IsEmpty() || !sender_bitmap_fetch_pending_;
+ bool button_bitmaps_ready = true;
+ for (unsigned int j = 0; j < GetButtonCount(); ++j) {
+ if (!GetButtonIconUrl(j).is_empty()
+ && button_bitmaps_[j].IsEmpty()
+ && button_bitmaps_fetch_pending_[j]) {
+ button_bitmaps_ready = false;
+ break;
+ }
+ }
+
+ return app_icon_ready && images_ready && sender_picture_ready &&
+ button_bitmaps_ready;
+}
+
+// Set the read state on the notification, returns true for success.
+void SyncedNotification::SetReadState(const ReadState& read_state) {
+
+ // Convert the read state to the protobuf type for read state.
+ if (kDismissed == read_state)
+ specifics_.mutable_coalesced_notification()->set_read_state(
+ sync_pb::CoalescedSyncedNotification_ReadState_DISMISSED);
+ else if (kUnread == read_state)
+ specifics_.mutable_coalesced_notification()->set_read_state(
+ sync_pb::CoalescedSyncedNotification_ReadState_UNREAD);
+ else if (kRead == read_state)
+ specifics_.mutable_coalesced_notification()->set_read_state(
+ sync_pb::CoalescedSyncedNotification_ReadState_READ);
+ else
+ NOTREACHED();
+}
+
} // namespace notifier

Powered by Google App Engine
This is Rietveld 408576698