Index: chrome/browser/resources/google_now/cards.js |
diff --git a/chrome/browser/resources/google_now/cards.js b/chrome/browser/resources/google_now/cards.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1ea9cd4c9bea236dffc48e881e2e7f24d3d63f47 |
--- /dev/null |
+++ b/chrome/browser/resources/google_now/cards.js |
@@ -0,0 +1,176 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+'use strict'; |
+ |
+var MS_IN_SECOND = 1000; |
+ |
+/** |
+ * Builds an object to manage notification card set. |
+ * @return {Object} Card set interface. |
+ */ |
+function buildCardSet() { |
+ var cardShowPrefix = 'card-show-'; |
+ var cardHidePrefix = 'card-hide-'; |
+ |
+ /** |
+ * Schedules hiding a notification. |
+ * @param {string} cardId Card ID. |
+ * @param {number=} opt_timeHide If specified, epoch time to hide the card. If |
+ * undefined, the card will be kept shown at least until next update. |
+ */ |
+ function scheduleHiding(cardId, opt_timeHide) { |
+ if (opt_timeHide === undefined) |
+ return; |
+ |
+ var alarmName = cardHidePrefix + cardId; |
+ var alarmInfo = {when: opt_timeHide}; |
+ chrome.alarms.create(alarmName, alarmInfo); |
+ } |
+ |
+ /** |
+ * Shows a notification. |
+ * @param {string} cardId Card ID. |
+ * @param {Object} cardCreateInfo Google Now card represented as a set of |
+ * parameters for showing a Chrome notification. |
+ */ |
+ function showNotification(cardId, cardCreateInfo) { |
+ console.log('cardManager.showNotification ' + cardId + ' ' + |
+ JSON.stringify(cardCreateInfo)); |
+ |
+ if (cardCreateInfo.previousVersion !== cardCreateInfo.version) { |
+ try { |
+ // Delete a notification with the specified id if it already exists, and |
+ // then create a notification. |
+ chrome.notifications.create( |
+ cardId, |
+ cardCreateInfo.notification, |
+ function(newNotificationId) { |
+ if (!newNotificationId || chrome.runtime.lastError) { |
+ var errorMessage = chrome.runtime.lastError && |
+ chrome.runtime.lastError.message; |
+ console.error('notifications.create: ID=' + newNotificationId + |
+ ', ERROR=' + errorMessage); |
+ return; |
+ } |
+ |
+ scheduleHiding(cardId, cardCreateInfo.timeHide); |
+ }); |
+ } catch (error) { |
+ console.error('Error in notifications.create: ' + error); |
+ } |
+ } else { |
+ try { |
+ // Update existing notification. |
+ chrome.notifications.update( |
+ cardId, |
+ cardCreateInfo.notification, |
+ function(wasUpdated) { |
+ if (!wasUpdated || chrome.runtime.lastError) { |
+ var errorMessage = chrome.runtime.lastError && |
+ chrome.runtime.lastError.message; |
+ console.error('notifications.update: UPDATED=' + wasUpdated + |
+ ', ERROR=' + errorMessage); |
+ return; |
+ } |
+ |
+ scheduleHiding(cardId, cardCreateInfo.timeHide); |
+ }); |
+ } catch (error) { |
+ console.error('Error in notifications.update: ' + error); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Updates/creates a card notification with new data. |
+ * @param {Object} card Google Now from the server. |
+ * @param {number=} previousVersion The version of the shown card with |
+ * this id, if it exists, undefined otherwise. |
+ * @return {Object} Notification data entry for this card. |
+ */ |
+ function update(card, previousVersion) { |
+ console.log('cardManager.update ' + JSON.stringify(card) + ' ' + |
+ previousVersion); |
+ |
+ if (typeof card.version != 'number') { |
+ console.log('cardCreateInfo.version is not a number'); |
+ // Fix card version. |
+ card.version = previousVersion || 0; |
+ } |
+ |
+ // TODO(vadimt): Don't clear alarms etc that don't exist. Or make sure doing |
+ // this doesn't output an error to console. |
+ chrome.alarms.clear(cardHidePrefix + card.notificationId); |
+ |
+ var timeHide = card.trigger && card.trigger.hideTimeSec !== undefined ? |
+ Date.now() + card.trigger.hideTimeSec * MS_IN_SECOND : undefined; |
+ var cardCreateInfo = { |
+ notification: card.notification, |
+ timeHide: timeHide, |
+ version: card.version, |
+ previousVersion: previousVersion |
+ }; |
+ |
+ var cardShowAlarmName = cardShowPrefix + card.notificationId; |
+ if (card.trigger && card.trigger.showTimeSec) { |
+ // Card needs to be shown later. |
+ console.log('cardManager.register: postponed'); |
+ var alarmInfo = { |
+ when: Date.now() + card.trigger.showTimeSec * MS_IN_SECOND |
+ }; |
+ chrome.alarms.create(cardShowAlarmName, alarmInfo); |
+ } else { |
+ // Card needs to be shown immediately. |
+ console.log('cardManager.register: immediate'); |
+ chrome.alarms.clear(cardShowAlarmName); |
+ showNotification(card.notificationId, cardCreateInfo); |
+ } |
+ |
+ return { |
+ actionUrls: card.actionUrls, |
+ cardCreateInfo: cardCreateInfo, |
+ dismissalParameters: card.dismissal |
+ }; |
+ } |
+ |
+ /** |
+ * Removes a card notification. |
+ * @param {string} cardId Card ID. |
+ */ |
+ function clear(cardId) { |
+ console.log('cardManager.unregister ' + cardId); |
+ |
+ chrome.notifications.clear(cardId, function() {}); |
+ chrome.alarms.clear(cardShowPrefix + cardId); |
+ chrome.alarms.clear(cardHidePrefix + cardId); |
+ } |
+ |
+ chrome.alarms.onAlarm.addListener(function(alarm) { |
+ console.log('cardManager.onAlarm ' + JSON.stringify(alarm)); |
+ |
+ if (alarm.name.indexOf(cardShowPrefix) == 0) { |
+ // Alarm to show the card. |
+ var cardId = alarm.name.substring(cardShowPrefix.length); |
+ storage.get('notificationsData', function(items) { |
+ items.notificationsData = items.notificationsData || {}; |
+ console.log('cardManager.onAlarm.get ' + JSON.stringify(items)); |
+ var notificationData = items.notificationsData[cardId]; |
+ if (!notificationData) |
+ return; |
+ |
+ showNotification(cardId, notificationData.cardCreateInfo); |
+ }); |
+ } else if (alarm.name.indexOf(cardHidePrefix) == 0) { |
+ // Alarm to hide the card. |
+ var cardId = alarm.name.substring(cardHidePrefix.length); |
+ chrome.notifications.clear(cardId, function() {}); |
+ } |
+ }); |
+ |
+ return { |
+ update: update, |
+ clear: clear |
+ }; |
+} |