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

Side by Side Diff: chrome/browser/notifications/notification_conversion_helper.cc

Issue 441753002: Route newly created notifications to notification provider API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 4 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/notifications/notification_conversion_helper.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/extensions/api/notification_provider/notification_provi der_api.h"
dewittj 2014/08/12 18:47:39 I don't think this include is used.
liyanhou 2014/08/13 17:30:37 Done.
11 #include "chrome/common/extensions/api/notification_provider.h"
12 #include "ui/gfx/skia_util.h"
13
14 void NotificationConversionHelper::NotificationToNotificationOptions(
15 const Notification& notification,
16 extensions::api::notifications::NotificationOptions* options) {
17 // Extract required fields: type, title, message, and icon.
18 std::string type = MapTypeToString(notification.type());
19 options->type = extensions::api::notifications::ParseTemplateType(type);
20
21 if (!notification.icon().IsEmpty()) {
22 scoped_ptr<extensions::api::notifications::NotificationBitmap> icon(
23 new extensions::api::notifications::NotificationBitmap());
24 GfxImageToNotificationBitmap(&notification.icon(), icon.get());
25 options->icon_bitmap = icon.Pass();
26 }
27
28 options->title = scoped_ptr<std::string>(
29 new std::string(base::UTF16ToUTF8(notification.title())));
30 options->message = scoped_ptr<std::string>(
31 new std::string(base::UTF16ToUTF8(notification.message())));
32
33 // Handle optional data provided.
34 const message_center::RichNotificationData* rich_data =
35 &notification.rich_notification_data();
36
37 if (!rich_data->small_image.IsEmpty()) {
38 scoped_ptr<extensions::api::notifications::NotificationBitmap> icon_mask(
39 new extensions::api::notifications::NotificationBitmap());
40 GfxImageToNotificationBitmap(&rich_data->small_image, icon_mask.get());
41 options->app_icon_mask_bitmap = icon_mask.Pass();
42 }
43
44 options->priority = scoped_ptr<int>(new int(rich_data->priority));
45
46 options->is_clickable = scoped_ptr<bool>(new bool(rich_data->clickable));
47
48 options->event_time =
49 scoped_ptr<double>(new double(rich_data->timestamp.ToDoubleT()));
50
51 if (!rich_data->context_message.empty())
52 options->context_message = scoped_ptr<std::string>(
53 new std::string(base::UTF16ToUTF8(rich_data->context_message)));
54
55 if (!rich_data->buttons.empty()) {
56 scoped_ptr<std::vector<
57 linked_ptr<extensions::api::notifications::NotificationButton> > >
58 button_list(new std::vector<
59 linked_ptr<extensions::api::notifications::NotificationButton> >);
60 for (size_t i = 0; i < rich_data->buttons.size(); i++) {
61 linked_ptr<extensions::api::notifications::NotificationButton> button(
62 new extensions::api::notifications::NotificationButton);
63 button->title = base::UTF16ToUTF8(rich_data->buttons[i].title);
64
65 if (!rich_data->buttons[i].icon.IsEmpty()) {
66 scoped_ptr<extensions::api::notifications::NotificationBitmap> icon(
67 new extensions::api::notifications::NotificationBitmap());
68 GfxImageToNotificationBitmap(&rich_data->buttons[i].icon, icon.get());
69 button->icon_bitmap = icon.Pass();
70 }
71 button_list->push_back(button);
72 }
73 options->buttons = button_list.Pass();
74 }
75
76 // Only image type notifications should have images.
77 if (type == "image" && !rich_data->image.IsEmpty()) {
78 scoped_ptr<extensions::api::notifications::NotificationBitmap> image(
79 new extensions::api::notifications::NotificationBitmap());
80 GfxImageToNotificationBitmap(&notification.image(), image.get());
81 options->image_bitmap = image.Pass();
82 } else if (type != "image" && !rich_data->image.IsEmpty()) {
83 LOG(WARNING) << "Only image type notifications should have images.";
dewittj 2014/08/12 18:47:39 I am not sure that this deserves a LOG, possibly m
liyanhou 2014/08/13 17:30:37 Done.
84 }
85
86 // Only progress type notifications should have progress bars.
87 if (type == "progress")
88 options->progress = scoped_ptr<int>(new int(rich_data->progress));
89 else if (rich_data->progress != 0)
90 LOG(WARNING) << "Only progress type notifications should have progress.";
91
92 // Only list type notifications should have lists.
93 if (type == "list" && !rich_data->items.empty()) {
94 scoped_ptr<std::vector<
95 linked_ptr<extensions::api::notifications::NotificationItem> > >
96 list(new std::vector<
97 linked_ptr<extensions::api::notifications::NotificationItem> >);
98 for (size_t j = 0; j < rich_data->items.size(); j++) {
99 linked_ptr<extensions::api::notifications::NotificationItem> item(
100 new extensions::api::notifications::NotificationItem);
101 item->title = base::UTF16ToUTF8(rich_data->items[j].title);
102 item->message = base::UTF16ToUTF8(rich_data->items[j].message);
103 list->push_back(item);
104 }
105 options->items = list.Pass();
106 } else if (type != "list" && !rich_data->items.empty()) {
107 LOG(WARNING) << "Only list type notifications should have lists.";
108 }
109 }
110
111 void NotificationConversionHelper::GfxImageToNotificationBitmap(
dewittj 2014/08/12 18:47:39 Please bring the reverse function from notificatio
liyanhou 2014/08/13 17:30:37 Done.
112 const gfx::Image* gfx_image,
113 extensions::api::notifications::NotificationBitmap* notification_bitmap) {
114 SkBitmap sk_bitmap = gfx_image->AsBitmap();
115 sk_bitmap.lockPixels();
116
117 notification_bitmap->width = sk_bitmap.width();
118 notification_bitmap->height = sk_bitmap.height();
119 int pixel_count = sk_bitmap.width() * sk_bitmap.height();
120 const int BYTES_PER_PIXEL = 4;
121
122 uint32_t* bitmap_pixels = sk_bitmap.getAddr32(0, 0);
123 const unsigned char* bitmap =
124 reinterpret_cast<const unsigned char*>(bitmap_pixels);
125 unsigned char* bitmap_data(new unsigned char[pixel_count * BYTES_PER_PIXEL]);
126
127 gfx::ConvertSkiaToRGBA(bitmap, pixel_count, bitmap_data);
128 sk_bitmap.unlockPixels();
129
130 notification_bitmap->data = scoped_ptr<std::string>(new std::string(
dewittj 2014/08/12 18:47:39 nit: notification_bitmap->data.reset(new std::stri
liyanhou 2014/08/13 17:30:37 Done. Also changed all other occurrences in this f
131 bitmap_data, (bitmap_data + pixel_count * BYTES_PER_PIXEL)));
132 return;
133 }
134
135 std::string NotificationConversionHelper::MapTypeToString(
136 message_center::NotificationType type) {
137 switch (type) {
138 case message_center::NOTIFICATION_TYPE_BASE_FORMAT:
139 return "basic";
140 case message_center::NOTIFICATION_TYPE_IMAGE:
141 return "image";
142 case message_center::NOTIFICATION_TYPE_MULTIPLE:
143 return "list";
144 case message_center::NOTIFICATION_TYPE_PROGRESS:
145 return "progress";
146 default:
147 NOTREACHED();
148 return "";
149 }
150 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698