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

Side by Side Diff: chrome/browser/notifications/sync_notifier/synced_notification_app_info_service.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: Refactoring the image holders 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // The SyncedNotificationAppInfoService brings down read only metadata from the 5 // The SyncedNotificationAppInfoService brings down read only metadata from the
6 // sync server with information about the services sending synced notifications. 6 // sync server with information about the services sending synced notifications.
7 7
8 #include "chrome/browser/notifications/sync_notifier/synced_notification_app_inf o_service.h" 8 #include "chrome/browser/notifications/sync_notifier/synced_notification_app_inf o_service.h"
9 9
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service.h"
12 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_service_fac tory.h"
11 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
12 #include "sync/api/sync_change.h" 14 #include "sync/api/sync_change.h"
13 #include "sync/api/sync_change_processor.h" 15 #include "sync/api/sync_change_processor.h"
14 #include "sync/api/sync_error_factory.h" 16 #include "sync/api/sync_error_factory.h"
15 #include "sync/protocol/sync.pb.h" 17 #include "sync/protocol/sync.pb.h"
16 #include "sync/protocol/synced_notification_app_info_specifics.pb.h" 18 #include "sync/protocol/synced_notification_app_info_specifics.pb.h"
17 #include "url/gurl.h" 19 #include "url/gurl.h"
18 20
19 namespace notifier { 21 namespace notifier {
20 22
23 bool SyncedNotificationAppInfoService::avoid_bitmap_fetching_for_test_ = false;
24
21 SyncedNotificationAppInfoService::SyncedNotificationAppInfoService( 25 SyncedNotificationAppInfoService::SyncedNotificationAppInfoService(
22 Profile* profile) 26 Profile* profile)
23 : profile_(profile) {} 27 : profile_(profile), chrome_notifier_service_(NULL) {}
24 28
25 SyncedNotificationAppInfoService::~SyncedNotificationAppInfoService() {} 29 SyncedNotificationAppInfoService::~SyncedNotificationAppInfoService() {}
26 30
27 // Methods from BrowserContextKeyedService. 31 // Methods from BrowserContextKeyedService.
28 void SyncedNotificationAppInfoService::Shutdown() {} 32 void SyncedNotificationAppInfoService::Shutdown() {}
29 33
30 // syncer::SyncableService implementation. 34 // syncer::SyncableService implementation.
31 35
32 // This is called at startup to sync with the sync data. This code is not thread 36 // This is called at startup to sync with the sync data. This code is not thread
33 // safe, it should only be called by sync on the browser thread. 37 // safe, it should only be called by sync on the browser thread.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 // Process each incoming app_info protobuf. 153 // Process each incoming app_info protobuf.
150 const std::string& name = incoming->settings_display_name(); 154 const std::string& name = incoming->settings_display_name();
151 DCHECK_GT(name.length(), 0U); 155 DCHECK_GT(name.length(), 0U);
152 if (name.length() == 0) { 156 if (name.length() == 0) {
153 // If there is no unique id (name), there is nothing we can do. 157 // If there is no unique id (name), there is nothing we can do.
154 return; 158 return;
155 } 159 }
156 160
157 SyncedNotificationAppInfo* found = FindSyncedNotificationAppInfoByName(name); 161 SyncedNotificationAppInfo* found = FindSyncedNotificationAppInfoByName(name);
158 162
159 if (NULL != found) { 163 std::vector<std::string> old_app_ids;
164 std::vector<std::string> new_app_ids;
165 std::vector<std::string> added_app_ids;
166 std::vector<std::string> removed_app_ids;
167
168 new_app_ids = incoming->GetAppIdList();
169
170 if (NULL == found) {
171 added_app_ids = new_app_ids;
172 } else {
160 // When we have an update, some app id types may be added or removed. 173 // When we have an update, some app id types may be added or removed.
161 // Append to lists of added and removed types. 174 // Append to lists of added and removed types.
175 old_app_ids = found->GetAppIdList();
176 new_app_ids = incoming->GetAppIdList();
162 FreeSyncedNotificationAppInfoByName(name); 177 FreeSyncedNotificationAppInfoByName(name);
178
179 // Set up for a set difference by sorting the lists.
180 std::sort(old_app_ids.begin(), old_app_ids.end());
181 std::sort(new_app_ids.begin(), new_app_ids.end());
182
183 // Calculate which app ids are removed (in old, but not in new app ids).
184 std::set_difference(old_app_ids.begin(),
185 old_app_ids.end(),
186 new_app_ids.begin(),
187 new_app_ids.end(),
188 std::back_inserter(removed_app_ids));
189
190 // Calculate which app_ids are added (in new, but not in old app ids).
191 std::set_difference(new_app_ids.begin(),
192 new_app_ids.end(),
193 old_app_ids.begin(),
194 old_app_ids.end(),
195 std::back_inserter(added_app_ids));
196 }
197
198 // Put these lists into the app_info object.
199 incoming->SetAddedAppIds(added_app_ids);
200 incoming->SetRemovedAppIds(removed_app_ids);
201
202 // Start bitmap fetch.
203 if (!avoid_bitmap_fetching_for_test_) {
204 incoming->QueueBitmapFetchJobs();
205 incoming->StartBitmapFetch();
206 } else {
207 OnBitmapFetchesDone(incoming->added_app_ids(), incoming->removed_app_ids());
163 } 208 }
164 209
165 sending_service_infos_.push_back(incoming.release()); 210 sending_service_infos_.push_back(incoming.release());
211 }
166 212
213 void SyncedNotificationAppInfoService::OnBitmapFetchesDone(
214 std::vector<std::string> added_app_ids,
215 std::vector<std::string> removed_app_ids) {
167 // Tell the Chrome Notifier Service so it can show any notifications that were 216 // Tell the Chrome Notifier Service so it can show any notifications that were
168 // waiting for the app id to arrive, and to remave any notifications that are 217 // waiting for the app id to arrive, and to remave any notifications that are
169 // no longer supported. 218 // no longer supported.
170 // TODO(petewil): Notify CNS of added ids 219 if (chrome_notifier_service_ != NULL) {
171 // TODO(petewil): Notify CNS of deleted ids. 220 chrome_notifier_service_->SetAddedAppIds(added_app_ids);
221 chrome_notifier_service_->SetRemovedAppIds(removed_app_ids);
222 }
172 } 223 }
173 224
174 // Static Method. Convert from a server protobuf to our internal format. 225 // Static Method. Convert from a server protobuf to our internal format.
175 scoped_ptr<SyncedNotificationAppInfo> 226 scoped_ptr<SyncedNotificationAppInfo>
176 SyncedNotificationAppInfoService::CreateSyncedNotificationAppInfoFromProtobuf( 227 SyncedNotificationAppInfoService::CreateSyncedNotificationAppInfoFromProtobuf(
177 const sync_pb::SyncedNotificationAppInfo& server_app_info) { 228 const sync_pb::SyncedNotificationAppInfo& server_app_info) {
178 229
179 // Check for mandatory fields in the sync_data object. 230 // Check for mandatory fields in the sync_data object.
180 std::string display_name; 231 std::string display_name;
181 if (server_app_info.has_settings_display_name()) { 232 if (server_app_info.has_settings_display_name()) {
182 display_name = server_app_info.settings_display_name(); 233 display_name = server_app_info.settings_display_name();
183 } 234 }
184 scoped_ptr<SyncedNotificationAppInfo> app_info; 235 scoped_ptr<SyncedNotificationAppInfo> app_info;
185 if (display_name.length() == 0) 236 if (display_name.length() == 0)
186 return app_info.Pass(); 237 return app_info.Pass();
187 238
188 // Create a new app info object based on the supplied protobuf. 239 // Create a new app info object based on the supplied protobuf.
189 app_info.reset(new SyncedNotificationAppInfo(display_name)); 240 app_info.reset(new SyncedNotificationAppInfo(profile_, display_name, this));
190 241
191 // TODO(petewil): Eventually we will add the monochrome icon here, and we may 242 // TODO(petewil): Eventually we will add the monochrome icon here, and we may
192 // need to fetch the correct url for the current DPI. 243 // need to fetch the correct url for the current DPI.
193 // Add the icon URL, if any. 244 // Add the icon URL, if any.
194 if (server_app_info.has_icon()) { 245 if (server_app_info.has_icon()) {
195 std::string icon_url = server_app_info.icon().url(); 246 std::string icon_url = server_app_info.icon().url();
196 app_info->SetSettingsIcon(GURL(icon_url)); 247 app_info->SetSettingsURLs(GURL(icon_url), GURL());
dewittj 2014/03/24 17:35:50 please comment why blank GURL is used here (protob
Pete Williamson 2014/03/25 00:08:37 Done.
197 } 248 }
198 249
199 // Add all the AppIds from the protobuf. 250 // Add all the AppIds from the protobuf.
200 size_t app_id_count = server_app_info.app_id_size(); 251 size_t app_id_count = server_app_info.app_id_size();
201 for (size_t ii = 0; ii < app_id_count; ++ii) { 252 for (size_t ii = 0; ii < app_id_count; ++ii) {
202 app_info->AddAppId(server_app_info.app_id(ii)); 253 app_info->AddAppId(server_app_info.app_id(ii));
203 } 254 }
204 255
205 return app_info.Pass(); 256 return app_info.Pass();
206 } 257 }
207 258
208 // This returns a pointer into a vector that we own. Caller must not free it. 259 // This returns a pointer into a vector that we own. Caller must not free it.
209 // Returns NULL if no match is found. 260 // Returns NULL if no match is found.
210 notifier::SyncedNotificationAppInfo* 261 notifier::SyncedNotificationAppInfo*
211 SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByName( 262 SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByName(
212 const std::string& name) { 263 const std::string& name) {
213 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it = 264 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it =
214 sending_service_infos_.begin(); 265 sending_service_infos_.begin();
215 it != sending_service_infos_.end(); 266 it != sending_service_infos_.end();
216 ++it) { 267 ++it) {
217 SyncedNotificationAppInfo* app_info = *it; 268 SyncedNotificationAppInfo* app_info = *it;
218 if (name == app_info->settings_display_name()) 269 if (name == app_info->settings_display_name())
219 return *it; 270 return *it;
220 } 271 }
221 272
222 return NULL; 273 return NULL;
223 } 274 }
224 275
276 // This returns a pointer into a vector that we own. Caller must not free it.
277 // Returns NULL if no match is found.
278 notifier::SyncedNotificationAppInfo*
279 SyncedNotificationAppInfoService::FindSyncedNotificationAppInfoByAppId(
280 const std::string& app_id) {
281 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it =
282 sending_service_infos_.begin();
283 it != sending_service_infos_.end();
284 ++it) {
285 SyncedNotificationAppInfo* app_info = *it;
286 if (app_info->HasAppId(app_id))
287 return *it;
288 }
289
290 return NULL;
291 }
292
293 // Lookup the sending service name for a given app id.
294 std::string SyncedNotificationAppInfoService::FindSendingServiceNameFromAppId(
295 const std::string app_id) {
296 for (ScopedVector<SyncedNotificationAppInfo>::const_iterator it =
297 sending_service_infos_.begin();
298 it != sending_service_infos_.end();
299 ++it) {
300 SyncedNotificationAppInfo* app_info = *it;
301 if (app_info->HasAppId(app_id))
302 return app_info->settings_display_name();
303 }
304
305 return std::string();
306 }
307
225 void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName( 308 void SyncedNotificationAppInfoService::FreeSyncedNotificationAppInfoByName(
226 const std::string& name) { 309 const std::string& name) {
227 ScopedVector<SyncedNotificationAppInfo>::iterator it = 310 ScopedVector<SyncedNotificationAppInfo>::iterator it =
228 sending_service_infos_.begin(); 311 sending_service_infos_.begin();
229 for (; it != sending_service_infos_.end(); ++it) { 312 for (; it != sending_service_infos_.end(); ++it) {
230 SyncedNotificationAppInfo* app_info = *it; 313 SyncedNotificationAppInfo* app_info = *it;
231 if (name == app_info->settings_display_name()) { 314 if (name == app_info->settings_display_name()) {
232 sending_service_infos_.erase(it); 315 sending_service_infos_.erase(it);
233 return; 316 return;
234 } 317 }
235 } 318 }
236 } 319 }
237 320
321 std::vector<std::string>
322 SyncedNotificationAppInfoService::GetAllSendingServiceNames() {
323 std::vector<std::string> names;
324 ScopedVector<SyncedNotificationAppInfo>::iterator it =
325 sending_service_infos_.begin();
326
327 for (; it != sending_service_infos_.end(); ++it) {
328 SyncedNotificationAppInfo* app_info = *it;
329 names.push_back(app_info->settings_display_name());
330 }
331
332 return names;
333 }
334
238 // Add a new app info to our data structure. This takes ownership 335 // Add a new app info to our data structure. This takes ownership
239 // of the passed in pointer. 336 // of the passed in pointer.
240 void SyncedNotificationAppInfoService::Add( 337 void SyncedNotificationAppInfoService::Add(
241 scoped_ptr<SyncedNotificationAppInfo> app_info) { 338 scoped_ptr<SyncedNotificationAppInfo> app_info) {
242 sending_service_infos_.push_back(app_info.release()); 339 sending_service_infos_.push_back(app_info.release());
243 } 340 }
244 341
245 } // namespace notifier 342 } // namespace notifier
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698