| // Copyright 2016 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. |
| |
| /** |
| * @fileoverview Provides notification support for ChromeVox. |
| */ |
| |
| goog.provide('Notifications'); |
| |
| goog.require('PanelCommand'); |
| |
| /** |
| * ChromeVox update notification. |
| * @constructor |
| */ |
| function UpdateNotification() { |
| this.data = {}; |
| this.data.type = 'basic'; |
| this.data.iconUrl = '/images/chromevox-16.png'; |
| this.data.title = Msgs.getMsg('update_title'); |
| this.data.message = Msgs.getMsg('update_message_next'); |
| } |
| |
| UpdateNotification.prototype = { |
| /** @return {boolean} */ |
| shouldShow: function() { |
| return !localStorage['notifications_update_notification_shown'] && |
| chrome.runtime.getManifest().version >= '53' && |
| cvox.ChromeVox.isChromeOS; |
| }, |
| |
| /** Shows the notification. */ |
| show: function() { |
| if (!this.shouldShow()) |
| return; |
| chrome.notifications.create('update', this.data); |
| chrome.notifications.onClicked.addListener(this.onClicked); |
| chrome.notifications.onClosed.addListener(this.onClosed); |
| }, |
| |
| /** |
| * Handles the chrome.notifications event. |
| * @param {string} notificationId |
| */ |
| onClicked: function(notificationId) { |
| (new PanelCommand(PanelCommandType.TUTORIAL)).send(); |
| }, |
| |
| /** |
| * Handles the chrome.notifications event. |
| * @param {string} id |
| */ |
| onClosed: function(id) { |
| localStorage['notifications_update_notification_shown'] = true; |
| }, |
| |
| /** |
| * Removes all listeners added by this object. |
| */ |
| removeAllListeners: function() { |
| chrome.notifications.onClicked.removeListener(this.onClicked); |
| chrome.notifications.onClosed.removeListener(this.onClosed); |
| } |
| }; |
| |
| /** |
| * Set after an update is shown. |
| * @type {UpdateNotification} |
| */ |
| Notifications.currentUpdate; |
| |
| /** |
| * Runs notifications that should be shown for mode changes. |
| * @param {ChromeVoxMode} newMode |
| * @param {?ChromeVoxMode} oldMode Can be null at startup when no range was |
| * previously set. |
| */ |
| Notifications.onModeChange = function(newMode, oldMode) { |
| // Only run on background page. |
| if (document.location.href.indexOf('background.html') == -1) |
| return; |
| |
| if (newMode !== ChromeVoxMode.FORCE_NEXT) |
| return; |
| |
| // Reset the notifications only when mode changes after startup. This prevents |
| // us from making notification announcements every time on startup. |
| if (oldMode) |
| Notifications.reset(); |
| Notifications.currentUpdate = new UpdateNotification(); |
| Notifications.currentUpdate.show(); |
| }; |
| |
| /** |
| * Resets to a clean state. Future events will trigger update notifications. |
| */ |
| Notifications.reset = function() { |
| if (Notifications.currentUpdate) |
| Notifications.currentUpdate.removeAllListeners(); |
| delete localStorage['notifications_update_notification_shown']; |
| }; |