Index: chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc |
diff --git a/chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc b/chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc |
index 62995066503f662c69ba954cbb262063eb20f27f..d1a84e2d1ce037ac2ba337764214fff36e07d0a1 100644 |
--- a/chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc |
+++ b/chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.cc |
@@ -8,6 +8,8 @@ |
#include "chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h" |
+#include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "sync/api/sync_change.h" |
#include "sync/api/sync_change_processor.h" |
@@ -18,9 +20,11 @@ |
namespace notifier { |
+bool SyncedNotificationAppInfoService::avoid_bitmap_fetching_for_test_ = false; |
+ |
SyncedNotificationAppInfoService::SyncedNotificationAppInfoService( |
Profile* profile) |
- : profile_(profile) {} |
+ : profile_(profile), chrome_notifier_service_(NULL) {} |
SyncedNotificationAppInfoService::~SyncedNotificationAppInfoService() {} |
@@ -156,19 +160,66 @@ void SyncedNotificationAppInfoService::ProcessIncomingAppInfoProtobuf( |
SyncedNotificationAppInfo* found = FindSyncedNotificationAppInfoByName(name); |
- if (NULL != found) { |
+ std::vector<std::string> old_app_ids; |
+ std::vector<std::string> new_app_ids; |
+ std::vector<std::string> added_app_ids; |
+ std::vector<std::string> removed_app_ids; |
+ |
+ new_app_ids = incoming->GetAppIdList(); |
+ |
+ if (NULL == found) { |
+ added_app_ids = new_app_ids; |
+ } else { |
// When we have an update, some app id types may be added or removed. |
// Append to lists of added and removed types. |
+ old_app_ids = found->GetAppIdList(); |
+ new_app_ids = incoming->GetAppIdList(); |
FreeSyncedNotificationAppInfoByName(name); |
+ |
+ // Set up for a set difference by sorting the lists. |
+ std::sort(old_app_ids.begin(), old_app_ids.end()); |
dewittj
2014/03/20 18:00:28
is it better to maintain a sorted order within Syn
Pete Williamson
2014/03/25 00:08:37
Adding a new app info is incredibly rare, as is re
|
+ std::sort(new_app_ids.begin(), new_app_ids.end()); |
+ |
+ // Calculate which app ids are removed (in old, but not in new app ids). |
+ std::set_difference(old_app_ids.begin(), |
+ old_app_ids.end(), |
+ new_app_ids.begin(), |
+ new_app_ids.end(), |
+ std::back_inserter(removed_app_ids)); |
+ |
+ // Calculate which app_ids are added (in new, but not in old app ids). |
+ std::set_difference(new_app_ids.begin(), |
+ new_app_ids.end(), |
+ old_app_ids.begin(), |
+ old_app_ids.end(), |
+ std::back_inserter(added_app_ids)); |
+ } |
+ |
+ // Put these lists into the app_info object. |
+ incoming->SetAddedAppIds(added_app_ids); |
+ incoming->SetRemovedAppIds(removed_app_ids); |
+ |
+ // Start bitmap fetch. |
+ if (!avoid_bitmap_fetching_for_test_) { |
+ incoming->QueueBitmapFetchJobs(); |
+ incoming->StartBitmapFetch(); |
+ } else { |
+ OnBitmapFetchesDone(incoming->added_app_ids(), incoming->removed_app_ids()); |
} |
sending_service_infos_.push_back(incoming.release()); |
+} |
+void SyncedNotificationAppInfoService::OnBitmapFetchesDone( |
+ std::vector<std::string> added_app_ids, |
+ std::vector<std::string> removed_app_ids) { |
// Tell the Chrome Notifier Service so it can show any notifications that were |
// waiting for the app id to arrive, and to remave any notifications that are |
// no longer supported. |
- // TODO(petewil): Notify CNS of added ids |
- // TODO(petewil): Notify CNS of deleted ids. |
+ if (chrome_notifier_service_ != NULL) { |
+ chrome_notifier_service_->SetAddedAppIds(added_app_ids); |
+ chrome_notifier_service_->SetRemovedAppIds(removed_app_ids); |
+ } |
} |
// Static Method. Convert from a server protobuf to our internal format. |
@@ -186,7 +237,7 @@ SyncedNotificationAppInfoService::CreateSyncedNotificationAppInfoFromProtobuf( |
return app_info.Pass(); |
// Create a new app info object based on the supplied protobuf. |
- app_info.reset(new SyncedNotificationAppInfo(display_name)); |
+ app_info.reset(new SyncedNotificationAppInfo(profile_, display_name, this)); |
// TODO(petewil): Eventually we will add the monochrome icon here, and we may |
// need to fetch the correct url for the current DPI. |
@@ -222,6 +273,38 @@ SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByName( |
return NULL; |
} |
+// This returns a pointer into a vector that we own. Caller must not free it. |
+// Returns NULL if no match is found. |
+notifier::SyncedNotificationAppInfo* |
+SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByAppId( |
+ const std::string& app_id) { |
+ for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it = |
+ sending_service_infos_.begin(); |
+ it != sending_service_infos_.end(); |
+ ++it) { |
+ SyncedNotificationAppInfo* app_info = *it; |
+ if (app_info->HasAppId(app_id)) |
+ return *it; |
+ } |
+ |
+ return NULL; |
+} |
+ |
+// Lookup the sending service name for a given app id. |
+std::string SyncedNotificationAppInfoService::FindSendingServiceNameFromAppId( |
+ const std::string app_id) { |
+ for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it = |
+ sending_service_infos_.begin(); |
+ it != sending_service_infos_.end(); |
+ ++it) { |
+ SyncedNotificationAppInfo* app_info = *it; |
+ if (app_info->HasAppId(app_id)) |
+ return app_info->settings_display_name(); |
+ } |
+ |
+ return std::string(); |
+} |
+ |
void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName( |
const std::string& name) { |
ScopedVector<SyncedNotificationAppInfo>::iterator it = |
@@ -235,6 +318,20 @@ void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName( |
} |
} |
+std::vector<std::string> |
+SyncedNotificationAppInfoService::GetAllSendingServiceNames() { |
+ std::vector<std::string> names; |
+ ScopedVector<SyncedNotificationAppInfo>::iterator it = |
+ sending_service_infos_.begin(); |
+ |
+ for (; it != sending_service_infos_.end(); ++it) { |
+ SyncedNotificationAppInfo* app_info = *it; |
+ names.push_back(app_info->settings_display_name()); |
+ } |
+ |
+ return names; |
+} |
+ |
// Add a new app info to our data structure. This takes ownership |
// of the passed in pointer. |
void SyncedNotificationAppInfoService::Add( |