| // Copyright 2014 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. |
| |
| cr.define('hotword', function() { |
| 'use strict'; |
| |
| /** |
| * Base class for managing hotwording sessions. |
| * @param {!hotword.StateManager} stateManager Manager of global hotwording |
| * state. |
| * @param {!hotword.constants.SessionSource} sessionSource Source of the |
| * hotword session request. |
| * @constructor |
| */ |
| function BaseSessionManager(stateManager, sessionSource) { |
| /** |
| * Manager of global hotwording state. |
| * @protected {!hotword.StateManager} |
| */ |
| this.stateManager = stateManager; |
| |
| /** |
| * Source of the hotword session request. |
| * @private {!hotword.constants.SessionSource} |
| */ |
| this.sessionSource_ = sessionSource; |
| |
| /** |
| * Chrome event listeners. Saved so that they can be de-registered when |
| * hotwording is disabled. |
| * @private |
| */ |
| this.sessionRequestedListener_ = this.handleSessionRequested_.bind(this); |
| this.sessionStoppedListener_ = this.handleSessionStopped_.bind(this); |
| |
| // Need to setup listeners on startup, otherwise events that caused the |
| // event page to start up, will be lost. |
| this.setupListeners_(); |
| |
| this.stateManager.onStatusChanged.addListener(function() { |
| hotword.debug('onStatusChanged'); |
| this.updateListeners(); |
| }.bind(this)); |
| } |
| |
| BaseSessionManager.prototype = { |
| /** |
| * Return whether or not this session type is enabled. |
| * @protected |
| * @return {boolean} |
| */ |
| enabled: assertNotReached, |
| |
| /** |
| * Called when the hotwording session is stopped. |
| * @protected |
| */ |
| onSessionStop: function() { |
| }, |
| |
| /** |
| * Starts a launcher hotwording session. |
| * @param {hotword.constants.TrainingMode=} opt_mode The mode to start the |
| * recognizer in. |
| */ |
| startSession: function(opt_mode) { |
| this.stateManager.startSession( |
| this.sessionSource_, |
| function() { |
| chrome.hotwordPrivate.setHotwordSessionState(true, function() {}); |
| }, |
| this.handleHotwordTrigger.bind(this), |
| opt_mode); |
| }, |
| |
| /** |
| * Stops a launcher hotwording session. |
| * @private |
| */ |
| stopSession_: function() { |
| this.stateManager.stopSession(this.sessionSource_); |
| this.onSessionStop(); |
| }, |
| |
| /** |
| * Handles a hotword triggered event. |
| * @param {?Object} log Audio log data, if audio logging is enabled. |
| * @protected |
| */ |
| handleHotwordTrigger: function(log) { |
| hotword.debug('Hotword triggered: ' + this.sessionSource_, log); |
| chrome.hotwordPrivate.notifyHotwordRecognition('search', |
| log, |
| function() {}); |
| }, |
| |
| /** |
| * Handles a hotwordPrivate.onHotwordSessionRequested event. |
| * @private |
| */ |
| handleSessionRequested_: function() { |
| hotword.debug('handleSessionRequested_: ' + this.sessionSource_); |
| this.startSession(); |
| }, |
| |
| /** |
| * Handles a hotwordPrivate.onHotwordSessionStopped event. |
| * @private |
| */ |
| handleSessionStopped_: function() { |
| hotword.debug('handleSessionStopped_: ' + this.sessionSource_); |
| this.stopSession_(); |
| }, |
| |
| /** |
| * Set up event listeners. |
| * @private |
| */ |
| setupListeners_: function() { |
| if (chrome.hotwordPrivate.onHotwordSessionRequested.hasListener( |
| this.sessionRequestedListener_)) { |
| return; |
| } |
| |
| chrome.hotwordPrivate.onHotwordSessionRequested.addListener( |
| this.sessionRequestedListener_); |
| chrome.hotwordPrivate.onHotwordSessionStopped.addListener( |
| this.sessionStoppedListener_); |
| }, |
| |
| /** |
| * Remove event listeners. |
| * @private |
| */ |
| removeListeners_: function() { |
| chrome.hotwordPrivate.onHotwordSessionRequested.removeListener( |
| this.sessionRequestedListener_); |
| chrome.hotwordPrivate.onHotwordSessionStopped.removeListener( |
| this.sessionStoppedListener_); |
| }, |
| |
| /** |
| * Update event listeners based on the current hotwording state. |
| * @protected |
| */ |
| updateListeners: function() { |
| if (this.enabled()) { |
| this.setupListeners_(); |
| } else { |
| this.removeListeners_(); |
| this.stopSession_(); |
| } |
| } |
| }; |
| |
| return { |
| BaseSessionManager: BaseSessionManager |
| }; |
| }); |