OLD | NEW |
| (Empty) |
1 // Copyright 2016 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_builder_mac.h" | |
6 | |
7 #import <AppKit/AppKit.h> | |
8 | |
9 #include "base/mac/mac_util.h" | |
10 #include "base/mac/scoped_nsobject.h" | |
11 #include "chrome/grit/generated_resources.h" | |
12 #include "ui/base/l10n/l10n_util_mac.h" | |
13 | |
14 namespace { | |
15 | |
16 // Internal builder constants representing the different notification fields | |
17 // They don't need to be exposed outside the builder. | |
18 | |
19 NSString* const kNotificationTitle = @"title"; | |
20 NSString* const kNotificationSubTitle = @"subtitle"; | |
21 NSString* const kNotificationInformativeText = @"informativeText"; | |
22 NSString* const kNotificationImage = @"icon"; | |
23 NSString* const kNotificationButtonOne = @"buttonOne"; | |
24 NSString* const kNotificationButtonTwo = @"buttonTwo"; | |
25 NSString* const kNotificationTag = @"tag"; | |
26 | |
27 } // namespace | |
28 | |
29 namespace notification_builder { | |
30 | |
31 // Exposed constants to include user related data in the notification. | |
32 NSString* const kNotificationOrigin = @"notificationOrigin"; | |
33 NSString* const kNotificationId = @"notificationId"; | |
34 NSString* const kNotificationProfileId = @"notificationProfileId"; | |
35 NSString* const kNotificationIncognito = @"notificationIncognito"; | |
36 | |
37 } // namespace notification_builder | |
38 | |
39 @implementation NotificationBuilder { | |
40 base::scoped_nsobject<NSMutableDictionary> notificationData_; | |
41 } | |
42 | |
43 - (instancetype)init { | |
44 if ((self = [super init])) { | |
45 notificationData_.reset([[NSMutableDictionary alloc] init]); | |
46 } | |
47 return self; | |
48 } | |
49 | |
50 - (instancetype)initWithDictionary:(NSDictionary*)data { | |
51 if ((self = [super init])) { | |
52 notificationData_.reset([data copy]); | |
53 } | |
54 return self; | |
55 } | |
56 | |
57 - (void)setTitle:(NSString*)title { | |
58 if (title.length) | |
59 [notificationData_ setObject:title forKey:kNotificationTitle]; | |
60 } | |
61 | |
62 - (void)setSubTitle:(NSString*)subTitle { | |
63 if (subTitle.length) | |
64 [notificationData_ setObject:subTitle forKey:kNotificationSubTitle]; | |
65 } | |
66 | |
67 - (void)setContextMessage:(NSString*)contextMessage { | |
68 if (contextMessage.length) | |
69 [notificationData_ setObject:contextMessage | |
70 forKey:kNotificationInformativeText]; | |
71 } | |
72 | |
73 - (void)setIcon:(NSImage*)icon { | |
74 if (icon) | |
75 [notificationData_ setObject:icon forKey:kNotificationImage]; | |
76 } | |
77 | |
78 - (void)setButtons:(NSString*)primaryButton | |
79 secondaryButton:(NSString*)secondaryButton { | |
80 DCHECK(primaryButton.length); | |
81 [notificationData_ setObject:primaryButton forKey:kNotificationButtonOne]; | |
82 if (secondaryButton.length) { | |
83 [notificationData_ setObject:secondaryButton forKey:kNotificationButtonTwo]; | |
84 } | |
85 } | |
86 | |
87 - (void)setTag:(NSString*)tag { | |
88 if (tag.length) | |
89 [notificationData_ setObject:tag forKey:kNotificationTag]; | |
90 } | |
91 | |
92 - (void)setOrigin:(NSString*)origin { | |
93 if (origin.length) | |
94 [notificationData_ setObject:origin | |
95 forKey:notification_builder::kNotificationOrigin]; | |
96 } | |
97 | |
98 - (void)setNotificationId:(NSString*)notificationId { | |
99 DCHECK(notificationId.length); | |
100 [notificationData_ setObject:notificationId | |
101 forKey:notification_builder::kNotificationId]; | |
102 } | |
103 | |
104 - (void)setProfileId:(NSString*)profileId { | |
105 DCHECK(profileId.length); | |
106 [notificationData_ setObject:profileId | |
107 forKey:notification_builder::kNotificationProfileId]; | |
108 } | |
109 | |
110 - (void)setIncognito:(BOOL)incognito { | |
111 [notificationData_ setObject:[NSNumber numberWithBool:incognito] | |
112 forKey:notification_builder::kNotificationIncognito]; | |
113 } | |
114 | |
115 - (NSUserNotification*)buildUserNotification { | |
116 base::scoped_nsobject<NSUserNotification> toast( | |
117 [[NSUserNotification alloc] init]); | |
118 [toast setTitle:[notificationData_ objectForKey:kNotificationTitle]]; | |
119 [toast setSubtitle:[notificationData_ objectForKey:kNotificationSubTitle]]; | |
120 [toast setInformativeText:[notificationData_ | |
121 objectForKey:kNotificationInformativeText]]; | |
122 | |
123 // Icon | |
124 if ([notificationData_ objectForKey:kNotificationImage]) { | |
125 if ([toast respondsToSelector:@selector(_identityImage)]) { | |
126 NSImage* image = [notificationData_ objectForKey:kNotificationImage]; | |
127 [toast setValue:image forKey:@"_identityImage"]; | |
128 [toast setValue:@NO forKey:@"_identityImageHasBorder"]; | |
129 } | |
130 } | |
131 | |
132 // Buttons | |
133 if ([toast respondsToSelector:@selector(_showsButtons)]) { | |
134 [toast setValue:@YES forKey:@"_showsButtons"]; | |
135 // A default close button label is provided by the platform but we | |
136 // explicitly override it in case the user decides to not | |
137 // use the OS language in Chrome. | |
138 [toast setOtherButtonTitle:l10n_util::GetNSString( | |
139 IDS_NOTIFICATION_BUTTON_CLOSE)]; | |
140 | |
141 // Display the Settings button as the action button if there are either no | |
142 // developer-provided action buttons, or the alternate action menu is not | |
143 // available on this Mac version. This avoids needlessly showing the menu. | |
144 // TODO(miguelg): Extensions should not have a settings button. | |
145 if (![notificationData_ objectForKey:kNotificationButtonOne] || | |
146 ![toast respondsToSelector:@selector(_alwaysShowAlternateActionMenu)]) { | |
147 [toast setActionButtonTitle:l10n_util::GetNSString( | |
148 IDS_NOTIFICATION_BUTTON_SETTINGS)]; | |
149 } else { | |
150 // Otherwise show the alternate menu, then show the developer actions and | |
151 // finally the settings one. | |
152 DCHECK( | |
153 [toast respondsToSelector:@selector(_alwaysShowAlternateActionMenu)]); | |
154 DCHECK( | |
155 [toast respondsToSelector:@selector(_alternateActionButtonTitles)]); | |
156 [toast setActionButtonTitle:l10n_util::GetNSString( | |
157 IDS_NOTIFICATION_BUTTON_OPTIONS)]; | |
158 [toast setValue:@YES forKey:@"_alwaysShowAlternateActionMenu"]; | |
159 | |
160 NSMutableArray* buttons = [NSMutableArray arrayWithCapacity:3]; | |
161 [buttons | |
162 addObject:[notificationData_ objectForKey:kNotificationButtonOne]]; | |
163 if ([notificationData_ objectForKey:kNotificationButtonTwo]) { | |
164 [buttons | |
165 addObject:[notificationData_ objectForKey:kNotificationButtonTwo]]; | |
166 } | |
167 [buttons | |
168 addObject:l10n_util::GetNSString(IDS_NOTIFICATION_BUTTON_SETTINGS)]; | |
169 [toast setValue:buttons forKey:@"_alternateActionButtonTitles"]; | |
170 } | |
171 } | |
172 | |
173 // Tag | |
174 if ([toast respondsToSelector:@selector(setIdentifier:)] && | |
175 [notificationData_ objectForKey:kNotificationTag]) { | |
176 [toast setValue:[notificationData_ objectForKey:kNotificationTag] | |
177 forKey:@"identifier"]; | |
178 } | |
179 | |
180 NSString* origin = | |
181 [notificationData_ objectForKey:notification_builder::kNotificationOrigin] | |
182 ? [notificationData_ | |
183 objectForKey:notification_builder::kNotificationOrigin] | |
184 : @""; | |
185 DCHECK( | |
186 [notificationData_ objectForKey:notification_builder::kNotificationId]); | |
187 NSString* notificationId = | |
188 [notificationData_ objectForKey:notification_builder::kNotificationId]; | |
189 | |
190 DCHECK([notificationData_ | |
191 objectForKey:notification_builder::kNotificationProfileId]); | |
192 NSString* profileId = [notificationData_ | |
193 objectForKey:notification_builder::kNotificationProfileId]; | |
194 | |
195 DCHECK([notificationData_ | |
196 objectForKey:notification_builder::kNotificationIncognito]); | |
197 NSNumber* incognito = [notificationData_ | |
198 objectForKey:notification_builder::kNotificationIncognito]; | |
199 | |
200 toast.get().userInfo = @{ | |
201 notification_builder::kNotificationOrigin : origin, | |
202 notification_builder::kNotificationId : notificationId, | |
203 notification_builder::kNotificationProfileId : profileId, | |
204 notification_builder::kNotificationIncognito : incognito, | |
205 }; | |
206 | |
207 return toast.autorelease(); | |
208 } | |
209 | |
210 - (NSDictionary*)buildDictionary { | |
211 return [[notificationData_ copy] autorelease]; | |
212 } | |
213 | |
214 @end | |
OLD | NEW |