OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 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 'use strict'; | |
6 | |
7 var MS_IN_SECOND = 1000; | |
8 | |
9 /** | |
10 * Builds an object to manage notification cards. | |
11 * @return {Object} Card manager interface. | |
12 */ | |
13 function buildCardManager() { | |
14 var cardShowPrefix = 'card-show-'; | |
15 var cardHidePrefix = 'card-hide-'; | |
16 | |
17 /** | |
18 * Schedules hiding a notification. | |
19 * @param {string} cardId Card ID. | |
20 * @param {number=} opt_timeHide If specified, epoch time to hide the card. If | |
21 * undefined, the card will be kept shown at least until next update. | |
22 */ | |
23 function scheduleHiding(cardId, opt_timeHide) { | |
24 if (opt_timeHide === undefined) | |
25 return; | |
26 | |
27 var alarmName = cardHidePrefix + cardId; | |
28 var alarmInfo = {when: opt_timeHide}; | |
29 chrome.alarms.create(alarmName, alarmInfo); | |
30 } | |
31 | |
32 /** | |
33 * Shows a notification. | |
34 * @param {string} cardId Card ID. | |
35 * @param {Object} cardCreateInfo Google Now card represented as a set of | |
skare_
2013/07/23 21:25:53
worth typedef'ing this or documenting the structur
vadimt
2013/07/23 22:42:34
1. Scope will be as limited as it is now. This str
| |
36 * parameters for showing a Chrome notification. | |
37 */ | |
38 function showNotification(cardId, cardCreateInfo) { | |
39 console.log('cardManager.showNotification ' + cardId + ' ' + | |
40 JSON.stringify(cardCreateInfo)); | |
41 | |
42 if (cardCreateInfo.previousVersion !== cardCreateInfo.version) { | |
43 try { | |
44 // Delete a notification with the specified id if it already exists, and | |
45 // then create a notification. | |
46 chrome.notifications.create( | |
47 cardId, | |
48 cardCreateInfo.notification, | |
49 function(newNotificationId) { | |
50 if (!newNotificationId || chrome.runtime.lastError) { | |
51 var errorMessage = chrome.runtime.lastError && | |
52 chrome.runtime.lastError.message; | |
53 console.error('notifications.create: ID=' + newNotificationId + | |
54 ', ERROR=' + errorMessage); | |
55 return; | |
56 } | |
57 | |
58 scheduleHiding(cardId, cardCreateInfo.timeHide); | |
59 }); | |
60 } catch (error) { | |
61 console.error('Error in notifications.create: ' + error); | |
62 } | |
63 } else { | |
64 try { | |
65 // Update existing notification. | |
66 chrome.notifications.update( | |
67 cardId, | |
68 cardCreateInfo.notification, | |
69 function(wasUpdated) { | |
70 if (!wasUpdated || chrome.runtime.lastError) { | |
71 var errorMessage = chrome.runtime.lastError && | |
72 chrome.runtime.lastError.message; | |
73 console.error('notifications.update: UPDATED=' + wasUpdated + | |
74 ', ERROR=' + errorMessage); | |
75 return; | |
76 } | |
77 | |
78 scheduleHiding(cardId, cardCreateInfo.timeHide); | |
79 }); | |
80 } catch (error) { | |
81 console.error('Error in notifications.update: ' + error); | |
82 } | |
83 } | |
84 } | |
85 | |
86 /** | |
87 * Updates/creates a card notification with new data. | |
88 * @param {Object} card Google Now from the server. | |
89 * @param {number=} previousVersion The version of the shown card with | |
90 * this id, if it exists, undefined otherwise. | |
91 * @return {Object} Notification data entry for this card. | |
92 */ | |
93 function update(card, previousVersion) { | |
94 console.log('cardManager.update ' + JSON.stringify(card) + ' ' + | |
95 previousVersion); | |
96 | |
97 if (typeof card.version != 'number') { | |
98 console.log('cardCreateInfo.version is not a number'); | |
99 // Fix card version. | |
100 card.version = previousVersion || 0; | |
101 } | |
102 | |
103 // TODO(vadimt): Don't clear alarms etc that don't exist. Or make sure doing | |
104 // this doesn't output an error to console. | |
skare_
2013/07/23 19:55:56
up to you, but this might be worth checking for th
vadimt
2013/07/23 20:03:28
This depends on another CL (task improvements) tha
skare_
2013/07/23 21:25:53
[no action required]
ah ok, I think I misunderstoo
| |
105 chrome.alarms.clear(cardHidePrefix + card.notificationId); | |
106 | |
107 var timeHide = card.trigger && card.trigger.hideTimeSec !== undefined ? | |
108 Date.now() + card.trigger.hideTimeSec * MS_IN_SECOND : undefined; | |
109 var cardCreateInfo = { | |
110 notification: card.notification, | |
111 timeHide: timeHide, | |
112 version: card.version, | |
113 previousVersion: previousVersion | |
114 }; | |
115 | |
116 var cardShowAlarmName = cardShowPrefix + card.notificationId; | |
117 if (card.trigger && card.trigger.showTimeSec) { | |
118 // Card needs to be shown later. | |
119 console.log('cardManager.register: postponed'); | |
120 var alarmInfo = { | |
121 when: Date.now() + card.trigger.showTimeSec * MS_IN_SECOND | |
122 }; | |
123 chrome.alarms.create(cardShowAlarmName, alarmInfo); | |
124 } else { | |
125 // Card needs to be shown immediately. | |
126 console.log('cardManager.register: immediate'); | |
127 chrome.alarms.clear(cardShowAlarmName); | |
128 showNotification(card.notificationId, cardCreateInfo); | |
129 } | |
130 | |
131 return { | |
132 actionUrls: card.actionUrls, | |
133 cardCreateInfo: cardCreateInfo, | |
134 dismissalParameters: card.dismissal | |
135 }; | |
136 } | |
137 | |
138 /** | |
139 * Removes a card notification. | |
140 * @param {string} cardId Card ID. | |
141 */ | |
142 function clear(cardId) { | |
143 console.log('cardManager.unregister ' + cardId); | |
144 | |
145 chrome.notifications.clear(cardId, function() {}); | |
146 chrome.alarms.clear(cardShowPrefix + cardId); | |
147 chrome.alarms.clear(cardHidePrefix + cardId); | |
skare_
2013/07/23 21:25:53
similar to the above, the behavior for a nonexiste
vadimt
2013/07/23 22:42:34
It's all about red diagnostic output. But the exec
| |
148 } | |
149 | |
150 chrome.alarms.onAlarm.addListener(function(alarm) { | |
151 console.log('cardManager.onAlarm ' + JSON.stringify(alarm)); | |
152 | |
153 if (alarm.name.indexOf(cardShowPrefix) == 0) { | |
154 // Alarm to show the card. | |
155 var cardId = alarm.name.substring(cardShowPrefix.length); | |
156 storage.get('notificationsData', function(items) { | |
157 items.notificationsData = items.notificationsData || {}; | |
158 console.log('cardManager.onAlarm.get ' + JSON.stringify(items)); | |
159 var notificationData = items.notificationsData[cardId]; | |
160 if (!notificationData) | |
161 return; | |
162 | |
163 showNotification(cardId, notificationData.cardCreateInfo); | |
164 }); | |
165 } else if (alarm.name.indexOf(cardHidePrefix) == 0) { | |
166 // Alarm to hide the card. | |
167 var cardId = alarm.name.substring(cardHidePrefix.length); | |
168 chrome.notifications.clear(cardId, function() {}); | |
169 } | |
170 }); | |
171 | |
172 return { | |
173 update: update, | |
174 clear: clear | |
175 }; | |
176 } | |
OLD | NEW |