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

Side by Side Diff: chrome/browser/notifications/sync_notifier/synced_notification.cc

Issue 19771013: Adapting the UI to bring it closer to the spec, and fixing image fetching. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 (c) 2012 The Chromium Authors. All rights reserved. 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 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 #include "chrome/browser/notifications/sync_notifier/synced_notification.h" 5 #include "chrome/browser/notifications/sync_notifier/synced_notification.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "base/values.h" 10 #include "base/values.h"
11 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/notifications/notification.h" 12 #include "chrome/browser/notifications/notification.h"
13 #include "chrome/browser/notifications/notification_ui_manager.h" 13 #include "chrome/browser/notifications/notification_ui_manager.h"
14 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_delegate.h" 14 #include "chrome/browser/notifications/sync_notifier/chrome_notifier_delegate.h"
15 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
16 #include "sync/protocol/sync.pb.h" 16 #include "sync/protocol/sync.pb.h"
17 #include "sync/protocol/synced_notification_specifics.pb.h" 17 #include "sync/protocol/synced_notification_specifics.pb.h"
18 #include "ui/gfx/image/image.h" 18 #include "ui/gfx/image/image.h"
19 #include "ui/message_center/message_center_util.h" 19 #include "ui/message_center/message_center_util.h"
20 #include "ui/message_center/notification_types.h" 20 #include "ui/message_center/notification_types.h"
21 21
22 namespace { 22 namespace {
23 const char kExtensionScheme[] = "chrome-extension://"; 23 const char kExtensionScheme[] = "chrome-extension://";
24 const char kDefaultSyncedNotificationScheme[] = "https:";
24 25
25 // Today rich notifications only supports two buttons, make sure we don't 26 // Today rich notifications only supports two buttons, make sure we don't
26 // try to supply them with more than this number of buttons. 27 // try to supply them with more than this number of buttons.
27 const unsigned int kMaxNotificationButtonIndex = 2; 28 const unsigned int kMaxNotificationButtonIndex = 2;
28 29
29 bool UseRichNotifications() { 30 bool UseRichNotifications() {
30 return message_center::IsRichNotificationEnabled(); 31 return message_center::IsRichNotificationEnabled();
31 } 32 }
32 33
34 // Schema-less specs default badly in windows. If we find one, add the schema
35 // we expect instead of allowing windows specific GURL code to make it default
36 // to "file:".
37 std::string AddDefaultSchemaIfNeeded(std::string& url_spec) {
dewittj 2013/07/19 22:37:19 This function makes me sad. Is there anything else
Pete Williamson 2013/07/19 22:49:07 Yes, I share your sadness for this function. My f
38 #ifdef OS_WIN
39 if (url_spec.length() > 1 && url_spec[0] == '/' && url_spec[1] == '/')
40 return std::string(kDefaultSyncedNotificationScheme) + url_spec;
41 #endif // OS_WINDOWS
42
43 return url_spec;
44 }
45
33 } // namespace 46 } // namespace
34 47
35 namespace notifier { 48 namespace notifier {
36 49
37 COMPILE_ASSERT(static_cast<sync_pb::CoalescedSyncedNotification_ReadState>( 50 COMPILE_ASSERT(static_cast<sync_pb::CoalescedSyncedNotification_ReadState>(
38 SyncedNotification::kUnread) == 51 SyncedNotification::kUnread) ==
39 sync_pb::CoalescedSyncedNotification_ReadState_UNREAD, 52 sync_pb::CoalescedSyncedNotification_ReadState_UNREAD,
40 local_enum_must_match_protobuf_enum); 53 local_enum_must_match_protobuf_enum);
41 COMPILE_ASSERT(static_cast<sync_pb::CoalescedSyncedNotification_ReadState>( 54 COMPILE_ASSERT(static_cast<sync_pb::CoalescedSyncedNotification_ReadState>(
42 SyncedNotification::kRead) == 55 SyncedNotification::kRead) ==
(...skipping 26 matching lines...) Expand all
69 } 82 }
70 83
71 void SyncedNotification::OnFetchComplete(const GURL url, 84 void SyncedNotification::OnFetchComplete(const GURL url,
72 const SkBitmap* bitmap) { 85 const SkBitmap* bitmap) {
73 // TODO(petewil): Add timeout mechanism in case bitmaps take too long. Do we 86 // TODO(petewil): Add timeout mechanism in case bitmaps take too long. Do we
74 // already have one built into URLFetcher? 87 // already have one built into URLFetcher?
75 // Make sure we are on the thread we expect. 88 // Make sure we are on the thread we expect.
76 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 89 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
77 90
78 // Match the incoming bitmaps to URLs. In case this is a dup, make sure to 91 // Match the incoming bitmaps to URLs. In case this is a dup, make sure to
79 // Try all potentially matching urls. 92 // try all potentially matching urls.
80 if (GetAppIconUrl() == url && bitmap != NULL) { 93 if (GetAppIconUrl() == url && bitmap != NULL) {
81 app_icon_bitmap_ = gfx::Image::CreateFrom1xBitmap(*bitmap); 94 app_icon_bitmap_ = gfx::Image::CreateFrom1xBitmap(*bitmap);
82 } 95 }
83 if (GetImageUrl() == url && bitmap != NULL) { 96 if (GetImageUrl() == url && bitmap != NULL) {
84 image_bitmap_ = gfx::Image::CreateFrom1xBitmap(*bitmap); 97 image_bitmap_ = gfx::Image::CreateFrom1xBitmap(*bitmap);
85 } 98 }
99 if (GetProfilePictureUrl(0) == url && bitmap != NULL) {
100 sender_bitmap_ = gfx::Image::CreateFrom1xBitmap(*bitmap);
101 }
86 102
87 // If this URL matches one or more button bitmaps, save them off. 103 // If this URL matches one or more button bitmaps, save them off.
88 for (unsigned int i = 0; i < GetButtonCount(); ++i) { 104 for (unsigned int i = 0; i < GetButtonCount(); ++i) {
89 if (GetButtonIconUrl(i) == url && bitmap != NULL) 105 if (GetButtonIconUrl(i) == url && bitmap != NULL)
90 button_bitmaps_[i] = gfx::Image::CreateFrom1xBitmap(*bitmap); 106 button_bitmaps_[i] = gfx::Image::CreateFrom1xBitmap(*bitmap);
91 } 107 }
92 108
93 // Count off the bitmaps as they arrive. 109 // Count off the bitmaps as they arrive.
94 --active_fetcher_count_; 110 --active_fetcher_count_;
95 DCHECK_GE(active_fetcher_count_, 0); 111 DCHECK_GE(active_fetcher_count_, 0);
(...skipping 20 matching lines...) Expand all
116 profile_ = profile; 132 profile_ = profile;
117 DCHECK_EQ(active_fetcher_count_, 0); 133 DCHECK_EQ(active_fetcher_count_, 0);
118 134
119 // Ensure our bitmap vector has as many entries as there are buttons, 135 // Ensure our bitmap vector has as many entries as there are buttons,
120 // so that when the bitmaps arrive the vector has a slot for them. 136 // so that when the bitmaps arrive the vector has a slot for them.
121 for (unsigned int i = 0; i < GetButtonCount(); ++i) { 137 for (unsigned int i = 0; i < GetButtonCount(); ++i) {
122 button_bitmaps_.push_back(gfx::Image()); 138 button_bitmaps_.push_back(gfx::Image());
123 AddBitmapToFetchQueue(GetButtonIconUrl(i)); 139 AddBitmapToFetchQueue(GetButtonIconUrl(i));
124 } 140 }
125 141
142 // If there is a profile image bitmap, fetch it
143 if (GetProfilePictureCount() > 0) {
144 // TODO(petewil): When we have the capacity to display more than one bitmap,
145 // modify this code to fetch as many as we can display
146 AddBitmapToFetchQueue(GetProfilePictureUrl(0));
147 }
148
126 // If the URL is non-empty, add it to our queue of URLs to fetch. 149 // If the URL is non-empty, add it to our queue of URLs to fetch.
127 AddBitmapToFetchQueue(GetAppIconUrl()); 150 AddBitmapToFetchQueue(GetAppIconUrl());
128 AddBitmapToFetchQueue(GetImageUrl()); 151 AddBitmapToFetchQueue(GetImageUrl());
129 152
130 // If there are no bitmaps, call show now. 153 // If there are no bitmaps, call show now.
131 if (active_fetcher_count_ == 0) { 154 if (active_fetcher_count_ == 0) {
132 Show(notification_manager, notifier_service, profile); 155 Show(notification_manager, notifier_service, profile);
133 } 156 }
134 } 157 }
135 158
(...skipping 28 matching lines...) Expand all
164 notification_manager->CancelById(GetKey()); 187 notification_manager->CancelById(GetKey());
165 DVLOG(2) << "Dismissed notification arrived" 188 DVLOG(2) << "Dismissed notification arrived"
166 << GetHeading() << " " << GetText(); 189 << GetHeading() << " " << GetText();
167 return; 190 return;
168 } 191 }
169 192
170 // Set up the fields we need to send and create a Notification object. 193 // Set up the fields we need to send and create a Notification object.
171 GURL image_url = GetImageUrl(); 194 GURL image_url = GetImageUrl();
172 string16 text = UTF8ToUTF16(GetText()); 195 string16 text = UTF8ToUTF16(GetText());
173 string16 heading = UTF8ToUTF16(GetHeading()); 196 string16 heading = UTF8ToUTF16(GetHeading());
197 string16 description = UTF8ToUTF16(GetDescription());
198 string16 annotation = UTF8ToUTF16(GetAnnotation());
174 // TODO(petewil): Eventually put the display name of the sending service here. 199 // TODO(petewil): Eventually put the display name of the sending service here.
175 string16 display_source = UTF8ToUTF16(GetOriginUrl().spec()); 200 string16 display_source = UTF8ToUTF16(GetOriginUrl().spec());
176 string16 replace_key = UTF8ToUTF16(GetKey()); 201 string16 replace_key = UTF8ToUTF16(GetKey());
202 string16 notification_heading = heading;
203 string16 notification_text = text;
177 204
178 // The delegate will eventually catch calls that the notification 205 // The delegate will eventually catch calls that the notification
179 // was read or deleted, and send the changes back to the server. 206 // was read or deleted, and send the changes back to the server.
180 scoped_refptr<NotificationDelegate> delegate = 207 scoped_refptr<NotificationDelegate> delegate =
181 new ChromeNotifierDelegate(GetKey(), notifier_service); 208 new ChromeNotifierDelegate(GetKey(), notifier_service);
182 209
183 // Some inputs and fields are only used if there is a notification center. 210 // Some inputs and fields are only used if there is a notification center.
184 if (UseRichNotifications()) { 211 if (UseRichNotifications()) {
185 base::Time creation_time = 212 base::Time creation_time =
186 base::Time::FromDoubleT(static_cast<double>(GetCreationTime())); 213 base::Time::FromDoubleT(static_cast<double>(GetCreationTime()));
(...skipping 15 matching lines...) Expand all
202 // Fill the optional fields with the information we need to make a 229 // Fill the optional fields with the information we need to make a
203 // notification. 230 // notification.
204 message_center::RichNotificationData rich_notification_data; 231 message_center::RichNotificationData rich_notification_data;
205 rich_notification_data.timestamp = creation_time; 232 rich_notification_data.timestamp = creation_time;
206 if (priority != SyncedNotification::kUndefinedPriority) 233 if (priority != SyncedNotification::kUndefinedPriority)
207 rich_notification_data.priority = priority; 234 rich_notification_data.priority = priority;
208 235
209 // Fill in the button data. 236 // Fill in the button data.
210 // TODO(petewil): Today Rich notifiations are limited to two buttons. 237 // TODO(petewil): Today Rich notifiations are limited to two buttons.
211 // When rich notifications supports more, remove the 238 // When rich notifications supports more, remove the
212 // "&& i < kMaxNotificationButtonIndex" below. 239 // "&& i < kMaxNotificationButtonIndex" clause below.
213 for (unsigned int i = 0; 240 for (unsigned int i = 0;
214 i < button_count 241 i < button_count
215 && i < button_bitmaps_.size() 242 && i < button_bitmaps_.size()
216 && i < kMaxNotificationButtonIndex; 243 && i < kMaxNotificationButtonIndex;
217 ++i) { 244 ++i) {
218 // Stop at the first button with no title 245 // Stop at the first button with no title
219 std::string title = GetButtonTitle(i); 246 std::string title = GetButtonTitle(i);
220 if (title.empty()) 247 if (title.empty())
221 break; 248 break;
222 message_center::ButtonInfo button_info(UTF8ToUTF16(title)); 249 message_center::ButtonInfo button_info(UTF8ToUTF16(title));
223 if (!button_bitmaps_[i].IsEmpty()) 250 if (!button_bitmaps_[i].IsEmpty())
224 button_info.icon = button_bitmaps_[i]; 251 button_info.icon = button_bitmaps_[i];
225 rich_notification_data.buttons.push_back(button_info); 252 rich_notification_data.buttons.push_back(button_info);
226 } 253 }
227 254
228 // Fill in the bitmap images. 255 // Fill in the bitmap images.
229 if (!image_bitmap_.IsEmpty()) 256 if (!image_bitmap_.IsEmpty())
230 rich_notification_data.image = image_bitmap_; 257 rich_notification_data.image = image_bitmap_;
231 258
232 // Fill the individual notification fields for a multiple notification. 259 // Fill the individual notification fields for a multiple notification.
233 if (notification_count > 1) { 260 if (notification_count > 1) {
234 for (int ii = 0; ii < notification_count; ++ii) { 261 for (int ii = 0; ii < notification_count; ++ii) {
235 message_center::NotificationItem item( 262 message_center::NotificationItem item(
236 UTF8ToUTF16(GetContainedNotificationTitle(ii)), 263 UTF8ToUTF16(GetContainedNotificationTitle(ii)),
237 UTF8ToUTF16(GetContainedNotificationMessage(ii))); 264 UTF8ToUTF16(GetContainedNotificationMessage(ii)));
238 rich_notification_data.items.push_back(item); 265 rich_notification_data.items.push_back(item);
239 } 266 }
240 } 267 }
241 268
269 // Set the heading and text appropriately for the message type.
270 notification_text = annotation;
271 if (notification_type == message_center::NOTIFICATION_TYPE_IMAGE) {
272 // For an image, fill in the description field.
273 notification_text = description;
274 } else if (notification_count == 1) {
275 // For a single collapsed info entry, use the contained message if any.
276 std::string comment_body = GetContainedNotificationMessage(0);
277 std::string comment_header = GetContainedNotificationTitle(0);
278 if (!comment_header.empty() && !comment_body.empty())
279 notification_text = UTF8ToUTF16(comment_header) + UTF8ToUTF16(" ") +
280 UTF8ToUTF16(comment_body);
281 }
282
283 // If there is a single person sending, use their picture instead of the app
284 // icon.
285 // TODO(petewil): Someday combine multiple profile photos here.
286 gfx::Image icon_bitmap = app_icon_bitmap_;
287 if (GetProfilePictureCount() == 1) {
288 icon_bitmap = sender_bitmap_;
289 }
290
242 Notification ui_notification(notification_type, 291 Notification ui_notification(notification_type,
243 GetOriginUrl(), 292 GetOriginUrl(),
244 heading, 293 notification_heading,
245 text, 294 notification_text,
246 app_icon_bitmap_, 295 icon_bitmap,
247 WebKit::WebTextDirectionDefault, 296 WebKit::WebTextDirectionDefault,
248 display_source, 297 display_source,
249 replace_key, 298 replace_key,
250 rich_notification_data, 299 rich_notification_data,
251 delegate.get()); 300 delegate.get());
252 notification_manager->Add(ui_notification, profile); 301 notification_manager->Add(ui_notification, profile);
253 } else { 302 } else {
254 303 // In this case we have a Webkit Notification, not a Rich Notification.
255 Notification ui_notification(GetOriginUrl(), 304 Notification ui_notification(GetOriginUrl(),
256 GetAppIconUrl(), 305 GetAppIconUrl(),
257 heading, 306 notification_heading,
258 text, 307 notification_text,
259 WebKit::WebTextDirectionDefault, 308 WebKit::WebTextDirectionDefault,
260 display_source, 309 display_source,
261 replace_key, 310 replace_key,
262 delegate.get()); 311 delegate.get());
263 312
264 notification_manager->Add(ui_notification, profile); 313 notification_manager->Add(ui_notification, profile);
265 } 314 }
266 315
267 DVLOG(1) << "Showing Synced Notification! " << heading << " " << text 316 DVLOG(1) << "Showing Synced Notification! " << heading << " " << text
268 << " " << GetAppIconUrl() << " " << replace_key << " " 317 << " " << GetAppIconUrl() << " " << replace_key << " "
269 << GetReadState(); 318 << GetReadState();
270 319
271 return; 320 return;
272 } 321 }
273 322
274 // This should detect even small changes in case the server updated the 323 // This should detect even small changes in case the server updated the
275 // notification. 324 // notification. We ignore the timestamp if other fields match.
276 // TODO(petewil): Should I also ignore the timestamp if other fields match?
277 bool SyncedNotification::EqualsIgnoringReadState( 325 bool SyncedNotification::EqualsIgnoringReadState(
278 const SyncedNotification& other) const { 326 const SyncedNotification& other) const {
279 if (GetTitle() == other.GetTitle() && 327 if (GetTitle() == other.GetTitle() &&
280 GetHeading() == other.GetHeading() && 328 GetHeading() == other.GetHeading() &&
281 GetDescription() == other.GetDescription() && 329 GetDescription() == other.GetDescription() &&
330 GetAnnotation() == other.GetAnnotation() &&
282 GetAppId() == other.GetAppId() && 331 GetAppId() == other.GetAppId() &&
283 GetKey() == other.GetKey() && 332 GetKey() == other.GetKey() &&
284 GetOriginUrl() == other.GetOriginUrl() && 333 GetOriginUrl() == other.GetOriginUrl() &&
285 GetAppIconUrl() == other.GetAppIconUrl() && 334 GetAppIconUrl() == other.GetAppIconUrl() &&
286 GetImageUrl() == other.GetImageUrl() && 335 GetImageUrl() == other.GetImageUrl() &&
287 GetText() == other.GetText() && 336 GetText() == other.GetText() &&
288 // We intentionally skip read state 337 // We intentionally skip read state
289 GetCreationTime() == other.GetCreationTime() && 338 GetCreationTime() == other.GetCreationTime() &&
290 GetPriority() == other.GetPriority() && 339 GetPriority() == other.GetPriority() &&
291 GetDefaultDestinationTitle() == other.GetDefaultDestinationTitle() && 340 GetDefaultDestinationTitle() == other.GetDefaultDestinationTitle() &&
292 GetDefaultDestinationIconUrl() == other.GetDefaultDestinationIconUrl() && 341 GetDefaultDestinationIconUrl() == other.GetDefaultDestinationIconUrl() &&
293 GetNotificationCount() == other.GetNotificationCount() && 342 GetNotificationCount() == other.GetNotificationCount() &&
294 GetButtonCount() == other.GetButtonCount()) { 343 GetButtonCount() == other.GetButtonCount() &&
344 GetProfilePictureCount() == other.GetProfilePictureCount()) {
295 345
296 // If all the surface data matched, check, to see if contained data also 346 // If all the surface data matched, check, to see if contained data also
297 // matches, titles and messages. 347 // matches, titles and messages.
298 size_t count = GetNotificationCount(); 348 size_t count = GetNotificationCount();
299 for (size_t ii = 0; ii < count; ++ii) { 349 for (size_t ii = 0; ii < count; ++ii) {
300 if (GetContainedNotificationTitle(ii) != 350 if (GetContainedNotificationTitle(ii) !=
301 other.GetContainedNotificationTitle(ii)) 351 other.GetContainedNotificationTitle(ii))
302 return false; 352 return false;
303 if (GetContainedNotificationMessage(ii) != 353 if (GetContainedNotificationMessage(ii) !=
304 other.GetContainedNotificationMessage(ii)) 354 other.GetContainedNotificationMessage(ii))
305 return false; 355 return false;
306 } 356 }
307 357
308 // Make sure buttons match. 358 // Make sure buttons match.
309 count = GetButtonCount(); 359 count = GetButtonCount();
310 for (size_t jj = 0; jj < count; ++jj) { 360 for (size_t jj = 0; jj < count; ++jj) {
311 if (GetButtonTitle(jj) != other.GetButtonTitle(jj)) 361 if (GetButtonTitle(jj) != other.GetButtonTitle(jj))
312 return false; 362 return false;
313 if (GetButtonIconUrl(jj) != other.GetButtonIconUrl(jj)) 363 if (GetButtonIconUrl(jj) != other.GetButtonIconUrl(jj))
314 return false; 364 return false;
315 } 365 }
316 366
367 // Make sure profile icons match
368 count = GetButtonCount();
369 for (size_t kk = 0; kk < count; ++kk) {
370 if (GetProfilePictureUrl(kk) != other.GetProfilePictureUrl(kk))
371 return false;
372 }
373
317 // If buttons and notifications matched, they are equivalent. 374 // If buttons and notifications matched, they are equivalent.
318 return true; 375 return true;
319 } 376 }
320 377
321 return false; 378 return false;
322 } 379 }
323 380
324 // Set the read state on the notification, returns true for success. 381 // Set the read state on the notification, returns true for success.
325 void SyncedNotification::SetReadState(const ReadState& read_state) { 382 void SyncedNotification::SetReadState(const ReadState& read_state) {
326 383
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 419
363 std::string SyncedNotification::GetDescription() const { 420 std::string SyncedNotification::GetDescription() const {
364 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 421 if (!specifics_.coalesced_notification().render_info().collapsed_info().
365 simple_collapsed_layout().has_description()) 422 simple_collapsed_layout().has_description())
366 return std::string(); 423 return std::string();
367 424
368 return specifics_.coalesced_notification().render_info().collapsed_info(). 425 return specifics_.coalesced_notification().render_info().collapsed_info().
369 simple_collapsed_layout().description(); 426 simple_collapsed_layout().description();
370 } 427 }
371 428
429 std::string SyncedNotification::GetAnnotation() const {
430 if (!specifics_.coalesced_notification().render_info().collapsed_info().
431 simple_collapsed_layout().has_annotation())
432 return std::string();
433
434 return specifics_.coalesced_notification().render_info().collapsed_info().
435 simple_collapsed_layout().annotation();
436 }
437
372 std::string SyncedNotification::GetAppId() const { 438 std::string SyncedNotification::GetAppId() const {
373 if (!specifics_.coalesced_notification().has_app_id()) 439 if (!specifics_.coalesced_notification().has_app_id())
374 return std::string(); 440 return std::string();
375 return specifics_.coalesced_notification().app_id(); 441 return specifics_.coalesced_notification().app_id();
376 } 442 }
377 443
378 std::string SyncedNotification::GetKey() const { 444 std::string SyncedNotification::GetKey() const {
379 if (!specifics_.coalesced_notification().has_key()) 445 if (!specifics_.coalesced_notification().has_key())
380 return std::string(); 446 return std::string();
381 return specifics_.coalesced_notification().key(); 447 return specifics_.coalesced_notification().key();
382 } 448 }
383 449
384 GURL SyncedNotification::GetOriginUrl() const { 450 GURL SyncedNotification::GetOriginUrl() const {
385 std::string origin_url(kExtensionScheme); 451 std::string origin_url(kExtensionScheme);
386 origin_url += GetAppId(); 452 origin_url += GetAppId();
387 return GURL(origin_url); 453 return GURL(origin_url);
388 } 454 }
389 455
390 // TODO(petewil): This only returns the first icon. Make all the icons
391 // available.
392 GURL SyncedNotification::GetAppIconUrl() const { 456 GURL SyncedNotification::GetAppIconUrl() const {
393 if (specifics_.coalesced_notification().render_info().expanded_info(). 457 if (!specifics_.coalesced_notification().render_info().collapsed_info().
394 collapsed_info_size() == 0) 458 simple_collapsed_layout().has_app_icon())
395 return GURL(); 459 return GURL();
396 460
397 if (!specifics_.coalesced_notification().render_info().expanded_info(). 461 std::string url_spec = specifics_.coalesced_notification().render_info().
398 collapsed_info(0).simple_collapsed_layout().has_app_icon()) 462 collapsed_info().simple_collapsed_layout().app_icon().url();
463
464 url_spec = AddDefaultSchemaIfNeeded(url_spec);
465
466 return GURL(url_spec);
467 }
468
469 // TODO(petewil): This ignores all but the first image. If Rich Notifications
470 // supports more images someday, then fetch all images.
471 GURL SyncedNotification::GetImageUrl() const {
472 if (specifics_.coalesced_notification().render_info().collapsed_info().
473 simple_collapsed_layout().media_size() == 0)
399 return GURL(); 474 return GURL();
400 475
401 return GURL(specifics_.coalesced_notification().render_info(). 476 if (!specifics_.coalesced_notification().render_info().collapsed_info().
402 expanded_info().collapsed_info(0).simple_collapsed_layout(). 477 simple_collapsed_layout().media(0).image().has_url())
403 app_icon().url());
404 }
405
406 // TODO(petewil): This currenly only handles the first image from the first
407 // collapsed item, someday return all images.
408 GURL SyncedNotification::GetImageUrl() const {
409 if (specifics_.coalesced_notification().render_info().expanded_info().
410 simple_expanded_layout().media_size() == 0)
411 return GURL(); 478 return GURL();
412 479
413 if (!specifics_.coalesced_notification().render_info().expanded_info(). 480 std::string url_spec = specifics_.coalesced_notification().render_info().
414 simple_expanded_layout().media(0).image().has_url()) 481 collapsed_info().simple_collapsed_layout().media(0).image().url();
415 return GURL();
416 482
417 return GURL(specifics_.coalesced_notification().render_info(). 483 url_spec = AddDefaultSchemaIfNeeded(url_spec);
418 expanded_info().simple_expanded_layout().media(0).image().url()); 484
485 return GURL(url_spec);
419 } 486 }
420 487
421 std::string SyncedNotification::GetText() const { 488 std::string SyncedNotification::GetText() const {
422 if (!specifics_.coalesced_notification().render_info().expanded_info(). 489 if (!specifics_.coalesced_notification().render_info().expanded_info().
423 simple_expanded_layout().has_text()) 490 simple_expanded_layout().has_text())
424 return std::string(); 491 return std::string();
425 492
426 return specifics_.coalesced_notification().render_info().expanded_info(). 493 return specifics_.coalesced_notification().render_info().expanded_info().
427 simple_expanded_layout().text(); 494 simple_expanded_layout().text();
428 } 495 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 size_t SyncedNotification::GetNotificationCount() const { 551 size_t SyncedNotification::GetNotificationCount() const {
485 return specifics_.coalesced_notification().render_info(). 552 return specifics_.coalesced_notification().render_info().
486 expanded_info().collapsed_info_size(); 553 expanded_info().collapsed_info_size();
487 } 554 }
488 555
489 size_t SyncedNotification::GetButtonCount() const { 556 size_t SyncedNotification::GetButtonCount() const {
490 return specifics_.coalesced_notification().render_info().collapsed_info(). 557 return specifics_.coalesced_notification().render_info().collapsed_info().
491 target_size(); 558 target_size();
492 } 559 }
493 560
561 size_t SyncedNotification::GetProfilePictureCount() const {
562 return specifics_.coalesced_notification().render_info().collapsed_info().
563 simple_collapsed_layout().profile_image_size();
564 }
565
566 GURL SyncedNotification::GetProfilePictureUrl(unsigned int which_url) const {
567 if (GetProfilePictureCount() <= which_url)
568 return GURL();
569
570 std::string url_spec = specifics_.coalesced_notification().render_info().
571 collapsed_info().simple_collapsed_layout().profile_image(which_url).
572 image_url();
573
574 url_spec = AddDefaultSchemaIfNeeded(url_spec);
575
576 return GURL(url_spec);
577 }
578
579
494 std::string SyncedNotification::GetDefaultDestinationTitle() const { 580 std::string SyncedNotification::GetDefaultDestinationTitle() const {
495 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 581 if (!specifics_.coalesced_notification().render_info().collapsed_info().
496 default_destination().icon().has_alt_text()) { 582 default_destination().icon().has_alt_text()) {
497 return std::string(); 583 return std::string();
498 } 584 }
499 return specifics_.coalesced_notification().render_info().collapsed_info(). 585 return specifics_.coalesced_notification().render_info().collapsed_info().
500 default_destination().icon().alt_text(); 586 default_destination().icon().alt_text();
501 } 587 }
502 588
503 GURL SyncedNotification::GetDefaultDestinationIconUrl() const { 589 GURL SyncedNotification::GetDefaultDestinationIconUrl() const {
504 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 590 if (!specifics_.coalesced_notification().render_info().collapsed_info().
505 default_destination().icon().has_url()) { 591 default_destination().icon().has_url()) {
506 return GURL(); 592 return GURL();
507 } 593 }
508 return GURL(specifics_.coalesced_notification().render_info(). 594 std::string url_spec = specifics_.coalesced_notification().render_info().
509 collapsed_info().default_destination().icon().url()); 595 collapsed_info().default_destination().icon().url();
596
597 url_spec = AddDefaultSchemaIfNeeded(url_spec);
598
599 return GURL(url_spec);
510 } 600 }
511 601
512 GURL SyncedNotification::GetDefaultDestinationUrl() const { 602 GURL SyncedNotification::GetDefaultDestinationUrl() const {
513 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 603 if (!specifics_.coalesced_notification().render_info().collapsed_info().
514 default_destination().has_url()) { 604 default_destination().has_url()) {
515 return GURL(); 605 return GURL();
516 } 606 }
517 return GURL(specifics_.coalesced_notification().render_info(). 607 std::string url_spec = specifics_.coalesced_notification().render_info().
518 collapsed_info().default_destination().url()); 608 collapsed_info().default_destination().url();
609
610 url_spec = AddDefaultSchemaIfNeeded(url_spec);
611
612 return GURL(url_spec);
519 } 613 }
520 614
521 std::string SyncedNotification::GetButtonTitle( 615 std::string SyncedNotification::GetButtonTitle(
522 unsigned int which_button) const { 616 unsigned int which_button) const {
523 // Must ensure that we have a target before trying to access it. 617 // Must ensure that we have a target before trying to access it.
524 if (GetButtonCount() <= which_button) 618 if (GetButtonCount() <= which_button)
525 return std::string(); 619 return std::string();
526 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 620 if (!specifics_.coalesced_notification().render_info().collapsed_info().
527 target(which_button).action().icon().has_alt_text()) { 621 target(which_button).action().icon().has_alt_text()) {
528 return std::string(); 622 return std::string();
529 } 623 }
530 return specifics_.coalesced_notification().render_info().collapsed_info(). 624 return specifics_.coalesced_notification().render_info().collapsed_info().
531 target(which_button).action().icon().alt_text(); 625 target(which_button).action().icon().alt_text();
532 } 626 }
533 627
534 GURL SyncedNotification::GetButtonIconUrl(unsigned int which_button) const { 628 GURL SyncedNotification::GetButtonIconUrl(unsigned int which_button) const {
535 // Must ensure that we have a target before trying to access it. 629 // Must ensure that we have a target before trying to access it.
536 if (GetButtonCount() <= which_button) 630 if (GetButtonCount() <= which_button)
537 return GURL(); 631 return GURL();
538 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 632 if (!specifics_.coalesced_notification().render_info().collapsed_info().
539 target(which_button).action().icon().has_url()) { 633 target(which_button).action().icon().has_url()) {
540 return GURL(); 634 return GURL();
541 } 635 }
542 return GURL(specifics_.coalesced_notification().render_info(). 636 std::string url_spec = specifics_.coalesced_notification().render_info().
543 collapsed_info().target(which_button).action().icon().url()); 637 collapsed_info().target(which_button).action().icon().url();
638
639 url_spec = AddDefaultSchemaIfNeeded(url_spec);
640
641 return GURL(url_spec);
544 } 642 }
545 643
546 GURL SyncedNotification::GetButtonUrl(unsigned int which_button) const { 644 GURL SyncedNotification::GetButtonUrl(unsigned int which_button) const {
547 // Must ensure that we have a target before trying to access it. 645 // Must ensure that we have a target before trying to access it.
548 if (GetButtonCount() <= which_button) 646 if (GetButtonCount() <= which_button)
549 return GURL(); 647 return GURL();
550 if (!specifics_.coalesced_notification().render_info().collapsed_info(). 648 if (!specifics_.coalesced_notification().render_info().collapsed_info().
551 target(which_button).action().has_url()) { 649 target(which_button).action().has_url()) {
552 return GURL(); 650 return GURL();
553 } 651 }
554 return GURL(specifics_.coalesced_notification().render_info(). 652 std::string url_spec = specifics_.coalesced_notification().render_info().
555 collapsed_info().target(which_button).action().url()); 653 collapsed_info().target(which_button).action().url();
654
655 url_spec = AddDefaultSchemaIfNeeded(url_spec);
656
657 return GURL(url_spec);
556 } 658 }
557 659
558 std::string SyncedNotification::GetContainedNotificationTitle( 660 std::string SyncedNotification::GetContainedNotificationTitle(
559 int index) const { 661 int index) const {
560 if (specifics_.coalesced_notification().render_info().expanded_info(). 662 if (specifics_.coalesced_notification().render_info().expanded_info().
561 collapsed_info_size() < index + 1) 663 collapsed_info_size() < index + 1)
562 return std::string(); 664 return std::string();
563 665
564 return specifics_.coalesced_notification().render_info().expanded_info(). 666 return specifics_.coalesced_notification().render_info().expanded_info().
565 collapsed_info(index).simple_collapsed_layout().heading(); 667 collapsed_info(index).simple_collapsed_layout().heading();
566 } 668 }
567 669
568 std::string SyncedNotification::GetContainedNotificationMessage( 670 std::string SyncedNotification::GetContainedNotificationMessage(
569 int index) const { 671 int index) const {
570 if (specifics_.coalesced_notification().render_info().expanded_info(). 672 if (specifics_.coalesced_notification().render_info().expanded_info().
571 collapsed_info_size() < index + 1) 673 collapsed_info_size() < index + 1)
572 return std::string(); 674 return std::string();
573 675
574 return specifics_.coalesced_notification().render_info().expanded_info(). 676 return specifics_.coalesced_notification().render_info().expanded_info().
575 collapsed_info(index).simple_collapsed_layout().description(); 677 collapsed_info(index).simple_collapsed_layout().description();
576 } 678 }
577 679
578 } // namespace notifier 680 } // namespace notifier
OLDNEW
« no previous file with comments | « chrome/browser/notifications/sync_notifier/synced_notification.h ('k') | sync/protocol/synced_notification_render.proto » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698