OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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 'use strict'; | 5 'use strict'; |
6 | 6 |
7 /** | 7 /** |
8 * @fileoverview The event page for Google Now for Chrome implementation. | 8 * @fileoverview The event page for Google Now for Chrome implementation. |
9 * The Google Now event page gets Google Now cards from the server and shows | 9 * The Google Now event page gets Google Now cards from the server and shows |
10 * them as Chrome notifications. | 10 * them as Chrome notifications. |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
286 originalOnLoadEnd(event); | 286 originalOnLoadEnd(event); |
287 } | 287 } |
288 }); | 288 }); |
289 | 289 |
290 callbackBoolean(true); | 290 callbackBoolean(true); |
291 }); | 291 }); |
292 } | 292 } |
293 | 293 |
294 /** | 294 /** |
295 * Shows parsed and combined cards as notifications. | 295 * Shows parsed and combined cards as notifications. |
296 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from | |
297 * group name to group information. | |
296 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from | 298 * @param {Object.<ChromeNotificationId, CombinedCard>} cards Map from |
297 * chromeNotificationId to the combined card, containing cards to show. | 299 * chromeNotificationId to the combined card, containing cards to show. |
300 * @param {function()} onSuccess Called on success. | |
298 * @param {function(ReceivedNotification)=} onCardShown Optional parameter | 301 * @param {function(ReceivedNotification)=} onCardShown Optional parameter |
299 * called when each card is shown. | 302 * called when each card is shown. |
300 */ | 303 */ |
301 function showNotificationCards(cards, onCardShown) { | 304 function showNotificationCards( |
305 notificationGroups, cards, onSuccess, onCardShown) { | |
302 console.log('showNotificationCards ' + JSON.stringify(cards)); | 306 console.log('showNotificationCards ' + JSON.stringify(cards)); |
303 | 307 |
304 instrumented.notifications.getAll(function(notifications) { | 308 instrumented.notifications.getAll(function(notifications) { |
305 console.log('showNotificationCards-getAll ' + | 309 console.log('showNotificationCards-getAll ' + |
306 JSON.stringify(notifications)); | 310 JSON.stringify(notifications)); |
307 notifications = notifications || {}; | 311 notifications = notifications || {}; |
308 | 312 |
309 // Mark notifications that didn't receive an update as having received | 313 // Mark notifications that didn't receive an update as having received |
310 // an empty update. | 314 // an empty update. |
311 for (var chromeNotificationId in notifications) { | 315 for (var chromeNotificationId in notifications) { |
312 cards[chromeNotificationId] = cards[chromeNotificationId] || []; | 316 cards[chromeNotificationId] = cards[chromeNotificationId] || []; |
313 } | 317 } |
314 | 318 |
315 /** @type {Object.<string, NotificationDataEntry>} */ | 319 /** @type {Object.<string, NotificationDataEntry>} */ |
316 var notificationsData = {}; | 320 var notificationsData = {}; |
317 | 321 |
318 // Create/update/delete notifications. | 322 // Create/update/delete notifications. |
319 for (var chromeNotificationId in cards) { | 323 for (var chromeNotificationId in cards) { |
320 notificationsData[chromeNotificationId] = cardSet.update( | 324 notificationsData[chromeNotificationId] = cardSet.update( |
321 chromeNotificationId, | 325 chromeNotificationId, |
322 cards[chromeNotificationId], | 326 cards[chromeNotificationId], |
327 notificationGroups, | |
323 onCardShown); | 328 onCardShown); |
324 } | 329 } |
325 chrome.storage.local.set({notificationsData: notificationsData}); | 330 chrome.storage.local.set({notificationsData: notificationsData}); |
331 onSuccess(); | |
326 }); | 332 }); |
327 } | 333 } |
328 | 334 |
329 /** | 335 /** |
330 * Removes all cards and card state on Google Now close down. | 336 * Removes all cards and card state on Google Now close down. |
331 * For example, this occurs when the geolocation preference is unchecked in the | 337 * For example, this occurs when the geolocation preference is unchecked in the |
332 * content settings. | 338 * content settings. |
333 */ | 339 */ |
334 function removeAllCards() { | 340 function removeAllCards() { |
335 console.log('removeAllCards'); | 341 console.log('removeAllCards'); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 updateCardsAttempts.start(optinPollPeriodSeconds); | 416 updateCardsAttempts.start(optinPollPeriodSeconds); |
411 }); | 417 }); |
412 } | 418 } |
413 } | 419 } |
414 | 420 |
415 /** | 421 /** |
416 * Combines notification groups into a set of Chrome notifications and shows | 422 * Combines notification groups into a set of Chrome notifications and shows |
417 * them. | 423 * them. |
418 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from | 424 * @param {Object.<string, StoredNotificationGroup>} notificationGroups Map from |
419 * group name to group information. | 425 * group name to group information. |
426 * @param {function()} onSuccess Called on success. | |
420 * @param {function(ReceivedNotification)=} onCardShown Optional parameter | 427 * @param {function(ReceivedNotification)=} onCardShown Optional parameter |
421 * called when each card is shown. | 428 * called when each card is shown. |
422 */ | 429 */ |
423 function combineAndShowNotificationCards(notificationGroups, onCardShown) { | 430 function combineAndShowNotificationCards( |
431 notificationGroups, onSuccess, onCardShown) { | |
424 console.log('combineAndShowNotificationCards ' + | 432 console.log('combineAndShowNotificationCards ' + |
425 JSON.stringify(notificationGroups)); | 433 JSON.stringify(notificationGroups)); |
426 /** @type {Object.<ChromeNotificationId, CombinedCard>} */ | 434 /** @type {Object.<ChromeNotificationId, CombinedCard>} */ |
427 var combinedCards = {}; | 435 var combinedCards = {}; |
428 | 436 |
429 for (var groupName in notificationGroups) | 437 for (var groupName in notificationGroups) |
430 combineGroup(combinedCards, notificationGroups[groupName]); | 438 combineGroup(combinedCards, notificationGroups[groupName]); |
431 | 439 |
432 showNotificationCards(combinedCards, onCardShown); | 440 showNotificationCards( |
441 notificationGroups, combinedCards, onSuccess, onCardShown); | |
433 } | 442 } |
434 | 443 |
435 /** | 444 /** |
436 * Parses JSON response from the notification server, shows notifications and | 445 * Parses JSON response from the notification server, shows notifications and |
437 * schedules next update. | 446 * schedules next update. |
438 * @param {string} response Server response. | 447 * @param {string} response Server response. |
439 * @param {function(ReceivedNotification)=} onCardShown Optional parameter | 448 * @param {function(ReceivedNotification)=} onCardShown Optional parameter |
440 * called when each card is shown. | 449 * called when each card is shown. |
441 */ | 450 */ |
442 function parseAndShowNotificationCards(response, onCardShown) { | 451 function parseAndShowNotificationCards(response, onCardShown) { |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
524 // cards updates. | 533 // cards updates. |
525 if (receivedGroup.nextPollSeconds !== undefined) { | 534 if (receivedGroup.nextPollSeconds !== undefined) { |
526 storedGroup.nextPollTime = | 535 storedGroup.nextPollTime = |
527 now + receivedGroup.nextPollSeconds * MS_IN_SECOND; | 536 now + receivedGroup.nextPollSeconds * MS_IN_SECOND; |
528 } | 537 } |
529 | 538 |
530 updatedGroups[groupName] = storedGroup; | 539 updatedGroups[groupName] = storedGroup; |
531 } | 540 } |
532 | 541 |
533 scheduleNextPoll(updatedGroups, !parsedResponse.googleNowDisabled); | 542 scheduleNextPoll(updatedGroups, !parsedResponse.googleNowDisabled); |
534 chrome.storage.local.set({ | 543 combineAndShowNotificationCards(updatedGroups, |
vadimt
2013/12/13 20:07:40
nit: please start "updatedGroups," from new line
robliao
2013/12/13 20:38:17
Done.
| |
535 notificationGroups: updatedGroups, | 544 function() { |
536 recentDismissals: updatedRecentDismissals | 545 chrome.storage.local.set({ |
537 }); | 546 notificationGroups: updatedGroups, |
538 combineAndShowNotificationCards(updatedGroups, onCardShown); | 547 recentDismissals: updatedRecentDismissals |
539 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | 548 }); |
549 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | |
550 }, | |
551 onCardShown); | |
540 }); | 552 }); |
541 } | 553 } |
542 | 554 |
543 /** | 555 /** |
544 * Update Location Cards Shown Count. | 556 * Update Location Cards Shown Count. |
545 * @param {ReceivedNotification} receivedNotification Notification as it was | 557 * @param {ReceivedNotification} receivedNotification Notification as it was |
546 * received from the server. | 558 * received from the server. |
547 */ | 559 */ |
548 function countLocationCard(receivedNotification) { | 560 function countLocationCard(receivedNotification) { |
549 if (receivedNotification.locationBased) { | 561 if (receivedNotification.locationBased) { |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
898 if (!byUser) | 910 if (!byUser) |
899 return; | 911 return; |
900 | 912 |
901 // At this point we are guaranteed that the notification is a now card. | 913 // At this point we are guaranteed that the notification is a now card. |
902 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); | 914 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); |
903 | 915 |
904 tasks.add(DISMISS_CARD_TASK_NAME, function() { | 916 tasks.add(DISMISS_CARD_TASK_NAME, function() { |
905 dismissalAttempts.start(); | 917 dismissalAttempts.start(); |
906 | 918 |
907 instrumented.storage.local.get( | 919 instrumented.storage.local.get( |
908 ['pendingDismissals', 'notificationsData'], function(items) { | 920 ['pendingDismissals', 'notificationsData', 'notificationGroups'], |
909 items = items || {}; | 921 function(items) { |
910 /** @type {Array.<PendingDismissal>} */ | 922 items = items || {}; |
911 items.pendingDismissals = items.pendingDismissals || []; | 923 /** @type {Array.<PendingDismissal>} */ |
912 /** @type {Object.<string, NotificationDataEntry>} */ | 924 items.pendingDismissals = items.pendingDismissals || []; |
913 items.notificationsData = items.notificationsData || {}; | 925 /** @type {Object.<string, NotificationDataEntry>} */ |
926 items.notificationsData = items.notificationsData || {}; | |
927 /** @type {Object.<string, StoredNotificationGroup>} */ | |
928 items.notificationGroups = items.notificationGroups || {}; | |
914 | 929 |
915 /** @type {NotificationDataEntry} */ | 930 /** @type {NotificationDataEntry} */ |
916 var notificationData = items.notificationsData[chromeNotificationId] || { | 931 var notificationData = |
917 timestamp: Date.now(), | 932 items.notificationsData[chromeNotificationId] || |
918 combinedCard: [] | 933 { |
919 }; | 934 timestamp: Date.now(), |
935 combinedCard: [] | |
936 }; | |
920 | 937 |
921 var dismissalResult = | 938 var dismissalResult = |
922 cardSet.onDismissal(chromeNotificationId, notificationData); | 939 cardSet.onDismissal( |
940 chromeNotificationId, | |
941 notificationData, | |
942 items.notificationGroups); | |
923 | 943 |
924 for (var i = 0; i < dismissalResult.dismissals.length; i++) { | 944 for (var i = 0; i < dismissalResult.dismissals.length; i++) { |
925 /** @type {PendingDismissal} */ | 945 /** @type {PendingDismissal} */ |
926 var dismissal = { | 946 var dismissal = { |
927 chromeNotificationId: chromeNotificationId, | 947 chromeNotificationId: chromeNotificationId, |
928 time: Date.now(), | 948 time: Date.now(), |
929 dismissalData: dismissalResult.dismissals[i] | 949 dismissalData: dismissalResult.dismissals[i] |
930 }; | 950 }; |
931 items.pendingDismissals.push(dismissal); | 951 items.pendingDismissals.push(dismissal); |
932 } | 952 } |
933 | 953 |
934 items.notificationsData[chromeNotificationId] = | 954 items.notificationsData[chromeNotificationId] = |
935 dismissalResult.notificationData; | 955 dismissalResult.notificationData; |
936 | 956 |
937 chrome.storage.local.set({ | 957 chrome.storage.local.set(items); |
938 pendingDismissals: items.pendingDismissals, | |
939 notificationsData: items.notificationsData | |
940 }); | |
941 | 958 |
942 processPendingDismissals(function(success) {}); | 959 processPendingDismissals(function(success) {}); |
943 }); | 960 }); |
944 }); | 961 }); |
945 } | 962 } |
946 | 963 |
947 /** | 964 /** |
948 * Initializes the polling system to start monitoring location and fetching | 965 * Initializes the polling system to start monitoring location and fetching |
949 * cards. | 966 * cards. |
950 */ | 967 */ |
951 function startPollingCards() { | 968 function startPollingCards() { |
952 // Create an update timer for a case when for some reason location request | 969 // Create an update timer for a case when for some reason location request |
953 // gets stuck. | 970 // gets stuck. |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1118 // Show notifications received by earlier polls. Doing this as early as | 1135 // Show notifications received by earlier polls. Doing this as early as |
1119 // possible to reduce latency of showing first notifications. This mimics how | 1136 // possible to reduce latency of showing first notifications. This mimics how |
1120 // persistent notifications will work. | 1137 // persistent notifications will work. |
1121 tasks.add(SHOW_ON_START_TASK_NAME, function() { | 1138 tasks.add(SHOW_ON_START_TASK_NAME, function() { |
1122 instrumented.storage.local.get('notificationGroups', function(items) { | 1139 instrumented.storage.local.get('notificationGroups', function(items) { |
1123 console.log('onStartup-get ' + JSON.stringify(items)); | 1140 console.log('onStartup-get ' + JSON.stringify(items)); |
1124 items = items || {}; | 1141 items = items || {}; |
1125 /** @type {Object.<string, StoredNotificationGroup>} */ | 1142 /** @type {Object.<string, StoredNotificationGroup>} */ |
1126 items.notificationGroups = items.notificationGroups || {}; | 1143 items.notificationGroups = items.notificationGroups || {}; |
1127 | 1144 |
1128 combineAndShowNotificationCards(items.notificationGroups); | 1145 combineAndShowNotificationCards(items.notificationGroups, function() {}); |
vadimt
2013/12/13 20:07:40
We need to store notificationGroups here too, in c
robliao
2013/12/13 20:38:17
Ah. I for some reason thought we didn't need this.
| |
1129 }); | 1146 }); |
1130 }); | 1147 }); |
1131 | 1148 |
1132 initialize(); | 1149 initialize(); |
1133 }); | 1150 }); |
1134 | 1151 |
1135 instrumented. | 1152 instrumented. |
1136 preferencesPrivate. | 1153 preferencesPrivate. |
1137 googleGeolocationAccessEnabled. | 1154 googleGeolocationAccessEnabled. |
1138 onChange. | 1155 onChange. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1216 lastPollNowPayloads: items.lastPollNowPayloads, | 1233 lastPollNowPayloads: items.lastPollNowPayloads, |
1217 notificationGroups: items.notificationGroups | 1234 notificationGroups: items.notificationGroups |
1218 }); | 1235 }); |
1219 | 1236 |
1220 updateNotificationsCards(); | 1237 updateNotificationsCards(); |
1221 } | 1238 } |
1222 }); | 1239 }); |
1223 }); | 1240 }); |
1224 } | 1241 } |
1225 }); | 1242 }); |
OLD | NEW |