| Index: third_party/google_input_tools/src/chrome/os/inputview/controller.js
|
| diff --git a/third_party/google_input_tools/src/chrome/os/inputview/controller.js b/third_party/google_input_tools/src/chrome/os/inputview/controller.js
|
| index dbf7a42da86a512125a0ab2994fba5e0f71271cb..9c4d6ce0d9257ed2e216e19a5b2636c7ff44e3ac 100644
|
| --- a/third_party/google_input_tools/src/chrome/os/inputview/controller.js
|
| +++ b/third_party/google_input_tools/src/chrome/os/inputview/controller.js
|
| @@ -79,6 +79,7 @@ var SpecNodeName = i18n.input.chrome.inputview.SpecNodeName;
|
| var StateType = i18n.input.chrome.inputview.StateType;
|
| var SoundController = i18n.input.chrome.sounds.SoundController;
|
| var Type = i18n.input.chrome.message.Type;
|
| +var events = i18n.input.chrome.inputview.events;
|
| var util = i18n.input.chrome.inputview.util;
|
|
|
|
|
| @@ -182,10 +183,16 @@ i18n.input.chrome.inputview.Controller = function(keyset, languageCode,
|
| /** @private {!SoundController} */
|
| this.soundController_ = new SoundController(false);
|
|
|
| + /**
|
| + * Whether or not to commit the next gesture result.
|
| + *
|
| + * @private {boolean}
|
| + */
|
| + this.commitNextGestureResult_ = false;
|
| +
|
| /** @private {!i18n.input.chrome.inputview.KeyboardContainer} */
|
| this.container_ = new i18n.input.chrome.inputview.KeyboardContainer(
|
| this.adapter_, this.soundController_);
|
| - this.container_.render();
|
|
|
| /**
|
| * The context type and keyset mapping group by input method id.
|
| @@ -217,6 +224,13 @@ i18n.input.chrome.inputview.Controller = function(keyset, languageCode,
|
| this.statsForClosing_ = {};
|
|
|
| /**
|
| + * The time the last point was accepted.
|
| + *
|
| + * @private {number}
|
| + */
|
| + this.lastPointTime_ = 0;
|
| +
|
| + /**
|
| * The last height sent to window.resizeTo to avoid multiple equivalent calls.
|
| *
|
| * @private {number}
|
| @@ -312,6 +326,23 @@ Controller.HANDWRITING_CODE_SUFFIX_ = '-t-i0-handwrit';
|
|
|
|
|
| /**
|
| + * The US English compact layout prefix.
|
| + *
|
| + * @const {string}
|
| + * @private
|
| + */
|
| +Controller.US_COMPACT_PREFIX_ = 'us.compact';
|
| +
|
| +
|
| +/**
|
| + * Time threshold between samples sent to the back end.
|
| + *
|
| + * @const {number}
|
| + */
|
| +Controller.SUBSAMPLING_TIME_THRESHOLD = 100;
|
| +
|
| +
|
| +/**
|
| * True if the settings is loaded.
|
| *
|
| * @type {boolean}
|
| @@ -329,6 +360,15 @@ Controller.prototype.isKeyboardReady = false;
|
|
|
|
|
| /**
|
| + * True if the current keyset is the US english compact layout.
|
| + *
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| +Controller.prototype.isKeysetUSCompact_ = false;
|
| +
|
| +
|
| +/**
|
| * The auto repeat timer for backspace hold.
|
| *
|
| * @type {goog.async.Delay}
|
| @@ -432,6 +472,23 @@ Controller.prototype.title_;
|
|
|
|
|
| /**
|
| + * Whether to return to the standard character keyset after space is touched.
|
| + *
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| +Controller.prototype.returnToLetterKeysetOnSpace_ = false;
|
| +
|
| +
|
| +/**
|
| + * A cache of the previous gesture results.
|
| + *
|
| + * @private {!Array.<string>}
|
| + */
|
| +Controller.prototype.gestureResultsCache_;
|
| +
|
| +
|
| +/**
|
| * Registers event handlers.
|
| * @private
|
| */
|
| @@ -466,16 +523,20 @@ Controller.prototype.registerEventHandler_ = function() {
|
| listen(this.adapter_,
|
| i18n.input.chrome.DataSource.EventType.CANDIDATES_BACK,
|
| this.onCandidatesBack_).
|
| + listen(this.adapter_,
|
| + i18n.input.chrome.DataSource.EventType.GESTURES_BACK,
|
| + this.onGesturesBack_).
|
| listen(this.adapter_, EventType.URL_CHANGED, this.onURLChanged_).
|
| listen(this.adapter_, EventType.CONTEXT_FOCUS, this.onContextFocus_).
|
| listen(this.adapter_, EventType.CONTEXT_BLUR, this.onContextBlur_).
|
| listen(this.adapter_, EventType.VISIBILITY_CHANGE,
|
| this.onVisibilityChange_).
|
| listen(this.adapter_, EventType.SETTINGS_READY, this.onSettingsReady_).
|
| - listen(this.adapter_, Type.UPDATE_SETTINGS, this.onUpdateSettings_).
|
| - listen(this.adapter_, Type.FRONT_TOGGLE_LANGUAGE_STATE,
|
| - this.onUpdateToggleLanguateState_).
|
| - listen(this.adapter_, Type.VOICE_STATE_CHANGE, this.onVoiceStateChange_).
|
| + listen(this.adapter_, EventType.UPDATE_SETTINGS, this.onUpdateSettings_).
|
| + listen(this.adapter_, EventType.FRONT_TOGGLE_LANGUAGE_STATE,
|
| + this.onUpdateToggleLanguageState_).
|
| + listen(this.adapter_, EventType.VOICE_STATE_CHANGE,
|
| + this.onVoiceStateChange_).
|
| listen(this.adapter_, EventType.REFRESH, this.onRefresh_);
|
| };
|
|
|
| @@ -483,7 +544,7 @@ Controller.prototype.registerEventHandler_ = function() {
|
| /**
|
| * Handler for voice module state change.
|
| *
|
| - * @param {!i18n.input.chrome.message.Event} e .
|
| + * @param {!events.MessageEvent} e .
|
| * @private
|
| */
|
| Controller.prototype.onVoiceStateChange_ = function(e) {
|
| @@ -526,7 +587,7 @@ Controller.prototype.setDefaultKeyset_ = function(newKeyset) {
|
| /**
|
| * Callback for updating settings.
|
| *
|
| - * @param {!i18n.input.chrome.message.Event} e .
|
| + * @param {!events.MessageEvent} e .
|
| * @private
|
| */
|
| Controller.prototype.onUpdateSettings_ = function(e) {
|
| @@ -554,6 +615,17 @@ Controller.prototype.onUpdateSettings_ = function(e) {
|
| settings.soundOnKeypress = e.msg['soundOnKeypress'];
|
| this.soundController_.setEnabled(settings.soundOnKeypress);
|
| }
|
| + if (goog.isDef(e.msg['gestureEditing'])) {
|
| + settings.gestureEditing = e.msg['gestureEditing'];
|
| + var enabled = settings.gestureEditing && !this.adapter_.isA11yMode;
|
| + this.container_.swipeView.enabled = enabled;
|
| + this.container_.selectView.setSettingsEnabled(enabled);
|
| + }
|
| + if (goog.isDef(e.msg['gestureTyping'])) {
|
| + settings.gestureTyping = e.msg['gestureTyping'];
|
| + } else {
|
| + settings.gestureTyping = false;
|
| + }
|
| this.perfTracker_.tick(PerfTracker.TickName.BACKGROUND_SETTINGS_FETCHED);
|
| this.model_.stateManager.contextType = this.adapter_.contextType;
|
| this.maybeCreateViews_();
|
| @@ -581,6 +653,10 @@ Controller.prototype.onSettingsReady_ = function() {
|
| }
|
|
|
| this.isSettingReady = true;
|
| + // Don't render container twice.
|
| + if (!this.container_.isInDocument()) {
|
| + this.container_.render();
|
| + }
|
| var keysetMap = this.contextTypeToKeysetMap_[this.currentInputMethod_];
|
| var newKeyset = '';
|
| if (this.adapter_.isA11yMode) {
|
| @@ -597,8 +673,8 @@ Controller.prototype.onSettingsReady_ = function() {
|
| if (newKeyset) {
|
| this.setDefaultKeyset_(newKeyset);
|
| }
|
| - this.container_.selectView.setVisible(
|
| - this.adapter_.features.isEnabled(FeatureName.GESTURE_SELECTION));
|
| + this.container_.selectView.setSettingsEnabled(
|
| + this.model_.settings.gestureEditing && !this.adapter_.isA11yMode);
|
| // Loads resources in case the default keyset is changed.
|
| this.loadAllResources_();
|
| this.maybeCreateViews_();
|
| @@ -606,6 +682,29 @@ Controller.prototype.onSettingsReady_ = function() {
|
|
|
|
|
| /**
|
| + * Returns whether or not the gesture typing feature is enabled.
|
| + *
|
| + * @return {boolean}
|
| + * @private
|
| + */
|
| +Controller.prototype.gestureTypingEnabled_ = function() {
|
| + return this.isKeysetUSCompact_ && this.model_.settings.gestureTyping &&
|
| + !this.adapter_.isA11yMode && !this.adapter_.isChromeVoxOn;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Returns the time threshold for subsampling, in ms.
|
| + *
|
| + * @return {number}
|
| + * @private
|
| + */
|
| +Controller.prototype.subsamplingThreshold_ = function() {
|
| + return Controller.SUBSAMPLING_TIME_THRESHOLD;
|
| +};
|
| +
|
| +
|
| +/**
|
| * Gets the data for spatial module.
|
| *
|
| * @param {!i18n.input.chrome.inputview.elements.content.SoftKey} key .
|
| @@ -715,6 +814,31 @@ Controller.prototype.onPointerEvent_ = function(e) {
|
|
|
|
|
| /**
|
| + * Sends the last stroke from the gesture canvas view to the gesture decoder, if
|
| + * the last point was added past a time threshold.
|
| + *
|
| + * @param {boolean=} opt_force Whether or not to force send the gesture event.
|
| + * @private
|
| + */
|
| +Controller.prototype.maybeSendLastStroke_ = function(opt_force) {
|
| + // Subsample by returning early if the previous point was added too recently.
|
| + var currentTime = Date.now();
|
| + if (!opt_force && currentTime - this.lastPointTime_ <
|
| + this.subsamplingThreshold_()) {
|
| + return;
|
| + } else {
|
| + this.lastPointTime_ = currentTime;
|
| + }
|
| + var lastStroke = this.container_.gestureCanvasView.getLastStroke();
|
| + if (lastStroke) {
|
| + // This call will set up the necessary callbacks the decoder will use to
|
| + // communicate back to this class.
|
| + this.adapter_.sendGestureEvent(lastStroke.points);
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| * Handles the drag events. Generally, this will forward the event details to
|
| * the components that handle drawing, decoding, etc.
|
| *
|
| @@ -722,8 +846,14 @@ Controller.prototype.onPointerEvent_ = function(e) {
|
| * @private
|
| */
|
| Controller.prototype.onDragEvent_ = function(e) {
|
| - if (this.adapter_.isGestureTypingEnabled() && e.type == EventType.DRAG) {
|
| + if (this.gestureTypingEnabled_() && e.type == EventType.DRAG &&
|
| + !this.container_.swipeView.isVisible()) {
|
| this.container_.gestureCanvasView.addPoint(e);
|
| + if (e.view && this.container_.gestureCanvasView.isGesturing) {
|
| + // Ensure the last touched key is not highlighted.
|
| + e.view.setHighlighted(false);
|
| + this.maybeSendLastStroke_();
|
| + }
|
| return;
|
| }
|
| };
|
| @@ -819,6 +949,28 @@ Controller.prototype.executeCommand_ = function(command, opt_arg) {
|
| inputview.openSettings();
|
| }
|
| break;
|
| +
|
| + case CommandEnum.FLOATING:
|
| + if (inputview.setMode) {
|
| + inputview.setMode('FLOATING');
|
| + this.adapter_.isFloating = true;
|
| + this.container_.candidateView.setFloatingVKButtonsVisible(true);
|
| + this.resize();
|
| + setTimeout(function() {
|
| + var x = Math.floor((screen.width - window.innerWidth) / 2);
|
| + window.moveTo(x, window.screenY);
|
| + }, 0);
|
| + }
|
| + break;
|
| +
|
| + case CommandEnum.DOCKING:
|
| + if (inputview.setMode) {
|
| + inputview.setMode('FULL_WIDTH');
|
| + this.adapter_.isFloating = false;
|
| + this.container_.candidateView.setFloatingVKButtonsVisible(false);
|
| + }
|
| + break;
|
| +
|
| }
|
| };
|
|
|
| @@ -831,20 +983,28 @@ Controller.prototype.executeCommand_ = function(command, opt_arg) {
|
| * @private
|
| */
|
| Controller.prototype.handlePointerAction_ = function(view, e) {
|
| - if (this.adapter_.isGestureTypingEnabled() &&
|
| - e.type == EventType.POINTER_DOWN) {
|
| - this.container_.gestureCanvasView.startStroke(e);
|
| - }
|
| + if (this.gestureTypingEnabled_() && !this.container_.swipeView.isVisible()) {
|
| + if (e.type == EventType.POINTER_DOWN) {
|
| + this.container_.gestureCanvasView.startStroke(e);
|
| + view.setHighlighted(false);
|
| + }
|
|
|
| - if (this.adapter_.isGestureTypingEnabled() &&
|
| - e.type == EventType.POINTER_UP) {
|
| - this.container_.gestureCanvasView.endStroke(e);
|
| - }
|
| + // Determine if the gestureCanvasView was handling a gesture before calling
|
| + // endStroke, as it ends the current gesture.
|
| + var wasGesturing = this.container_.gestureCanvasView.isGesturing;
|
| + if (e.type == EventType.POINTER_UP && wasGesturing) {
|
| + this.container_.gestureCanvasView.endStroke(e);
|
| + this.maybeSendLastStroke_(true);
|
| + this.commitNextGestureResult_ = true;
|
| + }
|
|
|
| - // Do not trigger other actives when gesturing.
|
| - if (this.adapter_.isGestureTypingEnabled() &&
|
| - this.container_.gestureCanvasView.isGesturing) {
|
| - return;
|
| + // Do not trigger other activities when gesturing.
|
| + if (wasGesturing) {
|
| + if (e.type == EventType.POINTER_OVER) {
|
| + view.setHighlighted(false);
|
| + }
|
| + return;
|
| + }
|
| }
|
|
|
| // Listen for DOUBLE_CLICK as well to capture secondary taps on the spacebar.
|
| @@ -902,11 +1062,14 @@ Controller.prototype.handlePointerAction_ = function(view, e) {
|
| case ElementType.CANDIDATE:
|
| view = /** @type {!i18n.input.chrome.inputview.elements.content.
|
| Candidate} */ (view);
|
| + if (view.candidateType == CandidateType.TOOLTIP)
|
| + return;
|
| if (e.type == EventType.POINTER_UP) {
|
| if (view.candidateType == CandidateType.CANDIDATE) {
|
| this.adapter_.selectCandidate(view.candidate);
|
| } else if (view.candidateType == CandidateType.NUMBER) {
|
| - this.adapter_.commitText(view.candidate[Name.CANDIDATE]);
|
| + this.adapter_.sendKeyDownAndUpEvent(
|
| + view.candidate[Name.CANDIDATE], '');
|
| }
|
| this.container_.cleanStroke();
|
| this.soundController_.onKeyUp(ElementType.CANDIDATE);
|
| @@ -971,15 +1134,19 @@ Controller.prototype.handlePointerAction_ = function(view, e) {
|
| case ElementType.HWT_PRIVACY_GOT_IT:
|
| // Broadcasts the handwriting privacy confirmed message to let canvas
|
| // view handle it.
|
| - this.adapter_.dispatchEvent(new goog.events.Event(
|
| - Type.HWT_PRIVACY_GOT_IT));
|
| + if (e.type == EventType.POINTER_UP) {
|
| + this.adapter_.dispatchEvent(new goog.events.Event(
|
| + Type.HWT_PRIVACY_GOT_IT));
|
| + }
|
| return;
|
|
|
| case ElementType.VOICE_PRIVACY_GOT_IT:
|
| // Broadcasts the voice privacy confirmed message to let voice
|
| // view handle it.
|
| - this.adapter_.dispatchEvent(new goog.events.Event(
|
| - Type.VOICE_PRIVACY_GOT_IT));
|
| + if (e.type == EventType.POINTER_UP) {
|
| + this.adapter_.dispatchEvent(new goog.events.Event(
|
| + Type.VOICE_PRIVACY_GOT_IT));
|
| + }
|
| return;
|
|
|
| case ElementType.VOICE_VIEW:
|
| @@ -997,6 +1164,22 @@ Controller.prototype.handlePointerAction_ = function(view, e) {
|
| this.clearUnstickyState_();
|
| }
|
| return;
|
| + case ElementType.DRAG:
|
| + if (e.type == EventType.POINTER_DOWN && this.container_.floatingView) {
|
| + this.container_.floatingView.show();
|
| + }
|
| + return;
|
| + case ElementType.FLOATING_VIEW:
|
| + if (e.type == EventType.POINTER_UP && this.container_.floatingView) {
|
| + this.container_.floatingView.hide();
|
| + }
|
| + return;
|
| + case ElementType.RESIZE:
|
| + if (e.type == EventType.POINTER_UP) {
|
| + goog.dom.classlist.toggle(this.container_.getElement(), Css.SMALL);
|
| + this.resize();
|
| + }
|
| + return;
|
| case ElementType.CUT:
|
| case ElementType.COPY:
|
| case ElementType.PASTE:
|
| @@ -1134,6 +1317,7 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| this.stopBackspaceAutoRepeat_();
|
| }
|
| }
|
| + this.returnToLetterKeysetOnSpace_ = false;
|
| break;
|
|
|
| case ElementType.TAB_KEY:
|
| @@ -1144,6 +1328,7 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| } else if (e.type == EventType.POINTER_UP) {
|
| this.adapter_.sendKeyUpEvent('\u0009', KeyCodes.TAB);
|
| }
|
| + this.returnToLetterKeysetOnSpace_ = false;
|
| break;
|
|
|
| case ElementType.ENTER_KEY:
|
| @@ -1208,6 +1393,11 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| } else if (e.type == EventType.DOUBLE_CLICK && doubleSpacePeriod) {
|
| this.adapter_.doubleClickOnSpaceKey();
|
| }
|
| + if (this.returnToLetterKeysetOnSpace_) {
|
| + // Return to the letter keyset.
|
| + this.switchToKeyset(key.toKeyset);
|
| + this.returnToLetterKeysetOnSpace_ = false;
|
| + }
|
| break;
|
|
|
| case ElementType.SWITCHER_KEY:
|
| @@ -1232,6 +1422,7 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| key.toKeyset);
|
| }
|
| }
|
| + this.returnToLetterKeysetOnSpace_ = false;
|
| break;
|
|
|
| case ElementType.COMPACT_KEY:
|
| @@ -1255,6 +1446,11 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| }
|
| this.clearUnstickyState_();
|
| key.flickerredCharacter = '';
|
| + if (this.currentKeyset_.indexOf('symbol') != -1) {
|
| + // If this is the symbol keyset, a space as the next input should
|
| + // switch us to the standard keyset.
|
| + this.returnToLetterKeysetOnSpace_ = true;
|
| + }
|
| }
|
| break;
|
|
|
| @@ -1291,10 +1487,12 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
|
| var hasEmoji = !this.adapter_.isPasswordBox();
|
| var enableSettings = this.shouldEnableSettings() &&
|
| !!window.inputview && !!inputview.openSettings;
|
| + var enableFVK = this.adapter_.isFloatingVirtualKeyboardEnabled();
|
| this.adapter_.getInputMethods(function(inputMethods) {
|
| this.container_.menuView.show(key, defaultFullKeyset, isCompact,
|
| enableCompact, this.currentInputMethod_, inputMethods, hasHwt,
|
| - enableSettings, hasEmoji, this.adapter_.isA11yMode);
|
| + enableSettings, hasEmoji, this.adapter_.isA11yMode, enableFVK,
|
| + this.adapter_.isFloating);
|
| }.bind(this));
|
| }
|
| break;
|
| @@ -1415,6 +1613,10 @@ Controller.prototype.resetAll = function() {
|
| this.container_.menuView.hide();
|
| this.container_.swipeView.reset();
|
| this.container_.altDataView.hide();
|
| + this.container_.gesturePreviewView.hide();
|
| + if (this.container_.floatingView) {
|
| + this.container_.floatingView.hide();
|
| + }
|
| };
|
|
|
|
|
| @@ -1572,6 +1774,58 @@ Controller.prototype.onCandidatesBack_ = function(e) {
|
|
|
|
|
| /**
|
| + * Callback for gestures results event.
|
| + *
|
| + * @param {!i18n.input.chrome.DataSource.GesturesBackEvent} e .
|
| + * @private
|
| + */
|
| +Controller.prototype.onGesturesBack_ = function(e) {
|
| + if (!this.commitNextGestureResult_ &&
|
| + goog.array.equals(e.results, this.gestureResultsCache_)) {
|
| + // If gesture results have not updated, do not transmit to the UI.
|
| + return;
|
| + } else {
|
| + this.gestureResultsCache_ = e.results;
|
| + }
|
| + var bestResult = e.results[0];
|
| + if (this.container_.gesturePreviewView) {
|
| + this.container_.gesturePreviewView.show(bestResult);
|
| + }
|
| + // TODO: Resolve a race where multiple decoder results return after this flag
|
| + // is set to true.
|
| + if (this.commitNextGestureResult_) {
|
| + // Commit the best result.
|
| + this.adapter_.commitGestureResult(bestResult);
|
| + this.commitNextGestureResult_ = false;
|
| + this.gestureResultsCache_ = [];
|
| + }
|
| + this.showGestureCandidates_(e.results.slice(1));
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Shows the gesture results as candidates.
|
| + *
|
| + * @param {!Array<string>} results The gesture results to show.
|
| + * @private
|
| + */
|
| +Controller.prototype.showGestureCandidates_ = function(results) {
|
| + // Convert the results to the candidate format.
|
| + var candidates = [];
|
| + for (var i = 0; i < results.length; ++i) {
|
| + var candidate = {};
|
| + candidate[Name.CANDIDATE] = results[i];
|
| + candidate[Name.CANDIDATE_ID] = i;
|
| + candidate[Name.IS_EMOJI] = false;
|
| + candidate[Name.MATCHED_LENGTHS] = 0;
|
| + candidates.push(candidate);
|
| + }
|
| + // The source is empty as this is a gesture and not a series of key presses.
|
| + this.showCandidates_('', candidates, Controller.CandidatesOperation.NONE);
|
| +};
|
| +
|
| +
|
| +/**
|
| * Shows the candidates to the candidate view.
|
| *
|
| * @param {string} source The source text.
|
| @@ -1649,15 +1903,10 @@ Controller.prototype.clearCandidates_ = function() {
|
|
|
| if (this.currentKeyset_ == Controller.HANDWRITING_VIEW_CODE_ ||
|
| this.currentKeyset_ == Controller.EMOJI_VIEW_CODE_) {
|
| - if (!this.adapter_.isQPInputView) {
|
| - this.container_.candidateView.switchToIcon(
|
| - CandidateView.IconType.BACK, true);
|
| - } else {
|
| - this.container_.candidateView.switchToIcon(
|
| - CandidateView.IconType.VOICE, false);
|
| - this.container_.candidateView.switchToIcon(
|
| - CandidateView.IconType.EXPAND_CANDIDATES, false);
|
| - }
|
| + this.container_.candidateView.switchToIcon(
|
| + CandidateView.IconType.VOICE, false);
|
| + this.container_.candidateView.switchToIcon(
|
| + CandidateView.IconType.EXPAND_CANDIDATES, false);
|
| } else {
|
| this.container_.candidateView.switchToIcon(CandidateView.IconType.VOICE,
|
| this.adapter_.isVoiceInputEnabled);
|
| @@ -1788,13 +2037,16 @@ Controller.prototype.switchToKeyset = function(keyset) {
|
| this.contextTypeToKeysetMap_[this.currentInputMethod_][contextType] =
|
| keyset;
|
| }
|
| - if (this.adapter_.isQPInputView &&
|
| - goog.array.contains(Controller.MATERIAL_KEYSETS_, keyset)) {
|
| - this.loadResource_('m-' + keyset);
|
| - } else {
|
| - this.loadResource_(keyset);
|
| - }
|
| + this.loadResource_(keyset);
|
| }
|
| +
|
| + // TODO: The 'us' part of this code is a workaround an issue where other xkb
|
| + // languages seem to be sharing options between each other.
|
| + this.isKeysetUSCompact_ =
|
| + this.currentKeyset_.indexOf(Controller.US_COMPACT_PREFIX_) >= 0;
|
| + // If we're switching to a new keyset, we don't want spacebar to trigger
|
| + // another keyset switch.
|
| + this.returnToLetterKeysetOnSpace_ = false;
|
| };
|
|
|
|
|
| @@ -1822,10 +2074,7 @@ Controller.prototype.onConfigLoaded_ = function(e) {
|
| }
|
|
|
| var layoutId = data[i18n.input.chrome.inputview.SpecNodeName.LAYOUT];
|
| - if (this.adapter_.isQPInputView) {
|
| - layoutId = 'm-' + layoutId;
|
| - data[i18n.input.chrome.inputview.SpecNodeName.LAYOUT] = layoutId;
|
| - }
|
| + data[i18n.input.chrome.inputview.SpecNodeName.LAYOUT] = layoutId;
|
| var layoutData = this.layoutDataMap_[layoutId];
|
| if (layoutData) {
|
| this.maybeCreateViews_();
|
| @@ -1838,10 +2087,12 @@ Controller.prototype.onConfigLoaded_ = function(e) {
|
| /**
|
| * Resizes the whole UI.
|
| *
|
| - * @param {boolean=} opt_ignoreWindowResize .
|
| + * @param {boolean=} opt_preventResizeTo True if prevent calling
|
| + * window.resizeTo. Used in tests and local UI debug.
|
| */
|
| -Controller.prototype.resize = function(opt_ignoreWindowResize) {
|
| +Controller.prototype.resize = function(opt_preventResizeTo) {
|
| var height;
|
| + var width;
|
| var widthPercent;
|
| var candidateViewHeight;
|
| var isLandScape = screen.width > screen.height;
|
| @@ -1879,21 +2130,36 @@ Controller.prototype.resize = function(opt_ignoreWindowResize) {
|
| }
|
| candidateViewHeight = SizeSpec.NON_A11Y_CANDIDATE_VIEW_HEIGHT;
|
| }
|
| + width = this.adapter_.isFloating ?
|
| + Math.floor(screen.width * widthPercent) : screen.width;
|
| + widthPercent = this.adapter_.isFloating ? 1.0 : widthPercent;
|
| + if (goog.dom.classlist.contains(this.container_.getElement(), Css.SMALL)) {
|
| + height = SizeSpec.SMALL_SIZE_HEIGHT;
|
| + width = SizeSpec.SMALL_SIZE_WIDTH;
|
| + candidateViewHeight = SizeSpec.SMALL_SIZE_CANDIDATE_VIEW_HEIGHT;
|
| + }
|
|
|
| - if (window.innerHeight != height && !opt_ignoreWindowResize) {
|
| - if (this.lastResizeHeight_ != height) {
|
| + if ((window.innerHeight != height || window.innerWidth != width) &&
|
| + !opt_preventResizeTo) {
|
| + if (this.lastResizeHeight_ != height || window.innerWidth != width) {
|
| this.lastResizeHeight_ = height;
|
| - window.resizeTo(screen.width, height);
|
| + window.resizeTo(width, height);
|
| }
|
| return;
|
| }
|
|
|
| - this.container_.setContainerSize(screen.width, height, widthPercent,
|
| + this.container_.setContainerSize(width, height, widthPercent,
|
| candidateViewHeight);
|
| this.container_.candidateView.setToolbarVisible(this.shouldShowToolBar_());
|
| if (this.container_.currentKeysetView) {
|
| this.isKeyboardReady = true;
|
| }
|
| +
|
| + // Transmit the new layout to the decoder.
|
| + if (this.gestureTypingEnabled_()) {
|
| + this.adapter_.sendKeyboardLayout(
|
| + this.container_.currentKeysetView.getKeyboardLayoutForGesture());
|
| + }
|
| };
|
|
|
|
|
| @@ -1976,7 +2242,9 @@ Controller.prototype.initialize = function(keyset, languageCode, passwordLayout,
|
| }
|
| }
|
| this.languageCode_ = languageCode;
|
| - this.currentInputMethod_ = currentInputMethod;
|
| + // If can't get the current input method, set the original keyset as
|
| + // current input method.
|
| + this.currentInputMethod_ = currentInputMethod || keyset;
|
| var keySetMap = this.contextTypeToKeysetMap_[this.currentInputMethod_];
|
| if (!keySetMap) {
|
| keySetMap = this.contextTypeToKeysetMap_[this.currentInputMethod_] = {};
|
| @@ -1989,7 +2257,7 @@ Controller.prototype.initialize = function(keyset, languageCode, passwordLayout,
|
| this.isSettingReady = false;
|
| this.model_.settings = new i18n.input.chrome.inputview.Settings();
|
| this.model_.stateManager.isEnMode = false;
|
| - this.adapter_.initialize(languageCode ? languageCode.split('-')[0] : '');
|
| + this.adapter_.initialize();
|
| this.loadAllResources_();
|
| this.switchToKeyset(this.getActiveKeyset_());
|
|
|
| @@ -2123,10 +2391,10 @@ Controller.prototype.recordStatsForClosing_ = function(
|
| /**
|
| * Handles language state changing event.
|
| *
|
| - * @param {!i18n.input.chrome.message.Event} e .
|
| + * @param {!events.MessageEvent} e .
|
| * @private
|
| */
|
| -Controller.prototype.onUpdateToggleLanguateState_ = function(e) {
|
| +Controller.prototype.onUpdateToggleLanguageState_ = function(e) {
|
| if (this.adapter_.isA11yMode || this.currentKeyset_.indexOf('.compact') < 0) {
|
| // e.msg value means whether is Chinese mode now.
|
| if (this.model_.stateManager.isEnMode == e.msg) {
|
|
|