| Index: chrome/browser/resources/google_now/background.js
|
| diff --git a/chrome/browser/resources/google_now/background.js b/chrome/browser/resources/google_now/background.js
|
| index 188a3a92cd821664086afb7c67a9a1d48d2eb8ae..ee3d425435d4b4c7db63b5d55295a48436793040 100644
|
| --- a/chrome/browser/resources/google_now/background.js
|
| +++ b/chrome/browser/resources/google_now/background.js
|
| @@ -74,6 +74,11 @@ var MAXIMUM_DISMISSAL_AGE_MS = 24 * 60 * 60 * 1000; // 1 day
|
| var DISMISS_RETENTION_TIME_MS = 20 * 60 * 1000; // 20 minutes
|
|
|
| /**
|
| + * Default period for checking whether the user is opted in to Google Now.
|
| + */
|
| +var DEFAULT_OPTIN_CHECK_PERIOD_SECONDS = 60 * 60 * 24 * 7; // 1 week
|
| +
|
| +/**
|
| * Names for tasks that can be created by the extension.
|
| */
|
| var UPDATE_CARDS_TASK_NAME = 'update-cards';
|
| @@ -423,25 +428,36 @@ function mergeGroup(mergedCards, storageGroup) {
|
| * Schedules next cards poll.
|
| * @param {Object.<string, StorageGroup>} groups Map from group name to group
|
| * information.
|
| + * @param {boolean} isOptedIn True if the user is opted in to Google Now.
|
| */
|
| -function scheduleNextPoll(groups) {
|
| - var nextPollTime = null;
|
| -
|
| - for (var groupName in groups) {
|
| - var group = groups[groupName];
|
| - if (group.nextPollTime !== undefined) {
|
| - nextPollTime = nextPollTime == null ?
|
| - group.nextPollTime : Math.min(group.nextPollTime, nextPollTime);
|
| +function scheduleNextPoll(groups, isOptedIn) {
|
| + if (isOptedIn) {
|
| + var nextPollTime = null;
|
| +
|
| + for (var groupName in groups) {
|
| + var group = groups[groupName];
|
| + if (group.nextPollTime !== undefined) {
|
| + nextPollTime = nextPollTime == null ?
|
| + group.nextPollTime : Math.min(group.nextPollTime, nextPollTime);
|
| + }
|
| }
|
| - }
|
|
|
| - // At least one of the groups must have nextPollTime.
|
| - verify(nextPollTime != null, 'scheduleNextPoll: nextPollTime is null');
|
| -
|
| - var nextPollDelaySeconds = Math.max(
|
| - (nextPollTime - Date.now()) / MS_IN_SECOND,
|
| - MINIMUM_POLLING_PERIOD_SECONDS);
|
| - updateCardsAttempts.start(nextPollDelaySeconds);
|
| + // At least one of the groups must have nextPollTime.
|
| + verify(nextPollTime != null, 'scheduleNextPoll: nextPollTime is null');
|
| +
|
| + var nextPollDelaySeconds = Math.max(
|
| + (nextPollTime - Date.now()) / MS_IN_SECOND,
|
| + MINIMUM_POLLING_PERIOD_SECONDS);
|
| + updateCardsAttempts.start(nextPollDelaySeconds);
|
| + } else {
|
| + instrumented.metricsPrivate.getVariationParams(
|
| + 'GoogleNow', function(params) {
|
| + var optinPollPeriodSeconds =
|
| + parseInt(params && params.optinPollPeriodSeconds, 10) ||
|
| + DEFAULT_OPTIN_CHECK_PERIOD_SECONDS;
|
| + updateCardsAttempts.start(optinPollPeriodSeconds);
|
| + });
|
| + }
|
| }
|
|
|
| /**
|
| @@ -467,6 +483,13 @@ function parseAndShowNotificationCards(response) {
|
| console.log('parseAndShowNotificationCards ' + response);
|
| var parsedResponse = JSON.parse(response);
|
|
|
| + if (parsedResponse.googleNowDisabled) {
|
| + chrome.storage.local.set({googleNowEnabled: false});
|
| + // TODO(vadimt): Remove the line below once the server stops sending groups
|
| + // with 'googleNowDisabled' responses.
|
| + parsedResponse.groups = {};
|
| + }
|
| +
|
| var receivedGroups = parsedResponse.groups;
|
|
|
| // Populate groups with corresponding cards.
|
| @@ -524,7 +547,7 @@ function parseAndShowNotificationCards(response) {
|
| updatedGroups[groupName] = storageGroup;
|
| }
|
|
|
| - scheduleNextPoll(updatedGroups);
|
| + scheduleNextPoll(updatedGroups, !parsedResponse.googleNowDisabled);
|
| chrome.storage.local.set({notificationGroups: updatedGroups});
|
| mergeAndShowNotificationCards(updatedGroups);
|
| recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS);
|
| @@ -567,13 +590,44 @@ function requestNotificationGroups(groupNames) {
|
| }
|
|
|
| /**
|
| + * Requests the account opted-in state from the server.
|
| + * @param {function()} optedInCallback Function that will be called if
|
| + * opted-in state is 'true'.
|
| + */
|
| +function requestOptedIn(optedInCallback) {
|
| + console.log('requestOptedIn from ' + NOTIFICATION_CARDS_URL);
|
| +
|
| + var request = buildServerRequest('GET', 'settings/optin');
|
| +
|
| + request.onloadend = function(event) {
|
| + console.log(
|
| + 'requestOptedIn-onloadend ' + request.status + ' ' + request.response);
|
| + if (request.status == HTTP_OK) {
|
| + var parsedResponse = JSON.parse(request.response);
|
| + if (parsedResponse.value) {
|
| + chrome.storage.local.set({googleNowEnabled: true});
|
| + optedInCallback();
|
| + } else {
|
| + scheduleNextPoll({}, false);
|
| + }
|
| + }
|
| + };
|
| +
|
| + setAuthorization(request, function(success) {
|
| + if (success)
|
| + request.send();
|
| + });
|
| +}
|
| +
|
| +/**
|
| * Requests notification cards from the server.
|
| * @param {Location} position Location of this computer.
|
| */
|
| function requestNotificationCards(position) {
|
| console.log('requestNotificationCards ' + JSON.stringify(position));
|
|
|
| - instrumented.storage.local.get('notificationGroups', function(items) {
|
| + instrumented.storage.local.get(
|
| + ['notificationGroups', 'googleNowEnabled'], function(items) {
|
| console.log('requestNotificationCards-storage-get ' +
|
| JSON.stringify(items));
|
| items = items || {};
|
| @@ -590,7 +644,13 @@ function requestNotificationCards(position) {
|
| }
|
| }
|
|
|
| - requestNotificationGroups(groupsToRequest);
|
| + if (items.googleNowEnabled) {
|
| + requestNotificationGroups(groupsToRequest);
|
| + } else {
|
| + requestOptedIn(function() {
|
| + requestNotificationGroups(groupsToRequest);
|
| + });
|
| + }
|
| });
|
| }
|
|
|
| @@ -1082,7 +1142,8 @@ instrumented.pushMessaging.onMessage.addListener(function(message) {
|
| console.log('pushMessaging.onMessage ' + JSON.stringify(message));
|
| if (message.payload.indexOf('REQUEST_CARDS') == 0) {
|
| tasks.add(ON_PUSH_MESSAGE_START_TASK_NAME, function() {
|
| - instrumented.storage.local.get('lastPollNowPayloads', function(items) {
|
| + instrumented.storage.local.get(
|
| + ['lastPollNowPayloads', 'notificationGroups'], function(items) {
|
| // If storage.get fails, it's safer to do nothing, preventing polling
|
| // the server when the payload really didn't change.
|
| if (!items)
|
| @@ -1094,13 +1155,19 @@ instrumented.pushMessaging.onMessage.addListener(function(message) {
|
| if (items.lastPollNowPayloads[message.subchannelId] !=
|
| message.payload) {
|
| items.lastPollNowPayloads[message.subchannelId] = message.payload;
|
| - chrome.storage.local.set(
|
| - {lastPollNowPayloads: items.lastPollNowPayloads});
|
|
|
| - updateCardsAttempts.isRunning(function(running) {
|
| - if (running)
|
| - requestNotificationGroups(['PUSH' + message.subchannelId]);
|
| + items.notificationGroups = items.notificationGroups || {};
|
| + items.notificationGroups['PUSH' + message.subchannelId] = {
|
| + cards: [],
|
| + nextPollTime: Date.now()
|
| + };
|
| +
|
| + chrome.storage.local.set({
|
| + lastPollNowPayloads: items.lastPollNowPayloads,
|
| + notificationGroups: items.notificationGroups
|
| });
|
| +
|
| + updateNotificationsCards();
|
| }
|
| });
|
| });
|
|
|