| 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( |
| 535 notificationGroups: updatedGroups, | 544 updatedGroups, |
| 536 recentDismissals: updatedRecentDismissals | 545 function() { |
| 537 }); | 546 chrome.storage.local.set({ |
| 538 combineAndShowNotificationCards(updatedGroups, onCardShown); | 547 notificationGroups: updatedGroups, |
| 539 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | 548 recentDismissals: updatedRecentDismissals |
| 549 }); |
| 550 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); |
| 551 }, |
| 552 onCardShown); |
| 540 }); | 553 }); |
| 541 } | 554 } |
| 542 | 555 |
| 543 /** | 556 /** |
| 544 * Update Location Cards Shown Count. | 557 * Update Location Cards Shown Count. |
| 545 * @param {ReceivedNotification} receivedNotification Notification as it was | 558 * @param {ReceivedNotification} receivedNotification Notification as it was |
| 546 * received from the server. | 559 * received from the server. |
| 547 */ | 560 */ |
| 548 function countLocationCard(receivedNotification) { | 561 function countLocationCard(receivedNotification) { |
| 549 if (receivedNotification.locationBased) { | 562 if (receivedNotification.locationBased) { |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 if (!byUser) | 911 if (!byUser) |
| 899 return; | 912 return; |
| 900 | 913 |
| 901 // At this point we are guaranteed that the notification is a now card. | 914 // At this point we are guaranteed that the notification is a now card. |
| 902 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); | 915 chrome.metricsPrivate.recordUserAction('GoogleNow.Dismissed'); |
| 903 | 916 |
| 904 tasks.add(DISMISS_CARD_TASK_NAME, function() { | 917 tasks.add(DISMISS_CARD_TASK_NAME, function() { |
| 905 dismissalAttempts.start(); | 918 dismissalAttempts.start(); |
| 906 | 919 |
| 907 instrumented.storage.local.get( | 920 instrumented.storage.local.get( |
| 908 ['pendingDismissals', 'notificationsData'], function(items) { | 921 ['pendingDismissals', 'notificationsData', 'notificationGroups'], |
| 909 items = items || {}; | 922 function(items) { |
| 910 /** @type {Array.<PendingDismissal>} */ | 923 items = items || {}; |
| 911 items.pendingDismissals = items.pendingDismissals || []; | 924 /** @type {Array.<PendingDismissal>} */ |
| 912 /** @type {Object.<string, NotificationDataEntry>} */ | 925 items.pendingDismissals = items.pendingDismissals || []; |
| 913 items.notificationsData = items.notificationsData || {}; | 926 /** @type {Object.<string, NotificationDataEntry>} */ |
| 927 items.notificationsData = items.notificationsData || {}; |
| 928 /** @type {Object.<string, StoredNotificationGroup>} */ |
| 929 items.notificationGroups = items.notificationGroups || {}; |
| 914 | 930 |
| 915 /** @type {NotificationDataEntry} */ | 931 /** @type {NotificationDataEntry} */ |
| 916 var notificationData = items.notificationsData[chromeNotificationId] || { | 932 var notificationData = |
| 917 timestamp: Date.now(), | 933 items.notificationsData[chromeNotificationId] || |
| 918 combinedCard: [] | 934 { |
| 919 }; | 935 timestamp: Date.now(), |
| 936 combinedCard: [] |
| 937 }; |
| 920 | 938 |
| 921 var dismissalResult = | 939 var dismissalResult = |
| 922 cardSet.onDismissal(chromeNotificationId, notificationData); | 940 cardSet.onDismissal( |
| 941 chromeNotificationId, |
| 942 notificationData, |
| 943 items.notificationGroups); |
| 923 | 944 |
| 924 for (var i = 0; i < dismissalResult.dismissals.length; i++) { | 945 for (var i = 0; i < dismissalResult.dismissals.length; i++) { |
| 925 /** @type {PendingDismissal} */ | 946 /** @type {PendingDismissal} */ |
| 926 var dismissal = { | 947 var dismissal = { |
| 927 chromeNotificationId: chromeNotificationId, | 948 chromeNotificationId: chromeNotificationId, |
| 928 time: Date.now(), | 949 time: Date.now(), |
| 929 dismissalData: dismissalResult.dismissals[i] | 950 dismissalData: dismissalResult.dismissals[i] |
| 930 }; | 951 }; |
| 931 items.pendingDismissals.push(dismissal); | 952 items.pendingDismissals.push(dismissal); |
| 932 } | 953 } |
| 933 | 954 |
| 934 items.notificationsData[chromeNotificationId] = | 955 items.notificationsData[chromeNotificationId] = |
| 935 dismissalResult.notificationData; | 956 dismissalResult.notificationData; |
| 936 | 957 |
| 937 chrome.storage.local.set({ | 958 chrome.storage.local.set(items); |
| 938 pendingDismissals: items.pendingDismissals, | |
| 939 notificationsData: items.notificationsData | |
| 940 }); | |
| 941 | 959 |
| 942 processPendingDismissals(function(success) {}); | 960 processPendingDismissals(function(success) {}); |
| 943 }); | 961 }); |
| 944 }); | 962 }); |
| 945 } | 963 } |
| 946 | 964 |
| 947 /** | 965 /** |
| 948 * Initializes the polling system to start monitoring location and fetching | 966 * Initializes the polling system to start monitoring location and fetching |
| 949 * cards. | 967 * cards. |
| 950 */ | 968 */ |
| 951 function startPollingCards() { | 969 function startPollingCards() { |
| 952 // Create an update timer for a case when for some reason location request | 970 // Create an update timer for a case when for some reason location request |
| 953 // gets stuck. | 971 // 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 | 1136 // Show notifications received by earlier polls. Doing this as early as |
| 1119 // possible to reduce latency of showing first notifications. This mimics how | 1137 // possible to reduce latency of showing first notifications. This mimics how |
| 1120 // persistent notifications will work. | 1138 // persistent notifications will work. |
| 1121 tasks.add(SHOW_ON_START_TASK_NAME, function() { | 1139 tasks.add(SHOW_ON_START_TASK_NAME, function() { |
| 1122 instrumented.storage.local.get('notificationGroups', function(items) { | 1140 instrumented.storage.local.get('notificationGroups', function(items) { |
| 1123 console.log('onStartup-get ' + JSON.stringify(items)); | 1141 console.log('onStartup-get ' + JSON.stringify(items)); |
| 1124 items = items || {}; | 1142 items = items || {}; |
| 1125 /** @type {Object.<string, StoredNotificationGroup>} */ | 1143 /** @type {Object.<string, StoredNotificationGroup>} */ |
| 1126 items.notificationGroups = items.notificationGroups || {}; | 1144 items.notificationGroups = items.notificationGroups || {}; |
| 1127 | 1145 |
| 1128 combineAndShowNotificationCards(items.notificationGroups); | 1146 combineAndShowNotificationCards(items.notificationGroups, function() { |
| 1147 chrome.storage.local.set(items); |
| 1148 }); |
| 1129 }); | 1149 }); |
| 1130 }); | 1150 }); |
| 1131 | 1151 |
| 1132 initialize(); | 1152 initialize(); |
| 1133 }); | 1153 }); |
| 1134 | 1154 |
| 1135 instrumented. | 1155 instrumented. |
| 1136 preferencesPrivate. | 1156 preferencesPrivate. |
| 1137 googleGeolocationAccessEnabled. | 1157 googleGeolocationAccessEnabled. |
| 1138 onChange. | 1158 onChange. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 lastPollNowPayloads: items.lastPollNowPayloads, | 1236 lastPollNowPayloads: items.lastPollNowPayloads, |
| 1217 notificationGroups: items.notificationGroups | 1237 notificationGroups: items.notificationGroups |
| 1218 }); | 1238 }); |
| 1219 | 1239 |
| 1220 updateNotificationsCards(); | 1240 updateNotificationsCards(); |
| 1221 } | 1241 } |
| 1222 }); | 1242 }); |
| 1223 }); | 1243 }); |
| 1224 } | 1244 } |
| 1225 }); | 1245 }); |
| OLD | NEW |