Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
Merge pull request #23258 from timdream/keyboard-switch-fail
Browse files Browse the repository at this point in the history
Bug 1054184 - Don't clear active targets right away, r=rudyl
  • Loading branch information
timdream committed Aug 28, 2014
2 parents 5c51782 + 1ef9117 commit 0535f7a
Show file tree
Hide file tree
Showing 4 changed files with 320 additions and 238 deletions.
5 changes: 5 additions & 0 deletions apps/keyboard/js/keyboard/active_targets_manager.js
Expand Up @@ -71,6 +71,11 @@ ActiveTargetsManager.prototype.stop = function() {
};

ActiveTargetsManager.prototype.clearAllTargets = function() {
if (this.activeTargets.size) {
console.warn('ActiveTargetsManager: clear ' +
this.activeTargets.size + ' active target(s).');
}

this.activeTargets.forEach(function(target, id) {
if (typeof this.ontargetcancelled === 'function') {
this.ontargetcancelled(target);
Expand Down
9 changes: 6 additions & 3 deletions apps/keyboard/js/keyboard/input_method_manager.js
Expand Up @@ -338,9 +338,13 @@ InputMethodManager.prototype.updateInputContextData = function() {
return;
}

var p = this.app.inputContext.getText().then(function(value) {
// Save inputContext as a local variable;
// It is important that the promise is getting the inputContext
// it calls getText() on when resolved/rejected.
var inputContext = this.app.inputContext;

var p = inputContext.getText().then(function(value) {
this.app.perfTimer.printTime('updateInputContextData:promise resolved');
var inputContext = this.app.inputContext;

// Resolve to this object containing information of inputContext
return {
Expand All @@ -353,7 +357,6 @@ InputMethodManager.prototype.updateInputContextData = function() {
};
}.bind(this), function(error) {
console.warn('InputMethodManager: inputcontext.getText() was rejected.');
var inputContext = this.app.inputContext;

// Resolve to this object containing information of inputContext
// With empty string as value.
Expand Down
72 changes: 52 additions & 20 deletions apps/keyboard/js/keyboard/state_manager.js
Expand Up @@ -10,6 +10,12 @@ var StateManager = function(app) {
this._layoutName = undefined;
};

// Don't switch away IMEngine right away since the transition won't
// start until then, and we need to keep the keyboard responsive to user
// touch when visible.
// (This number corresponds to BLUR_CHANGE_DELAY in input management.)
StateManager.prototype.DEACTIVATE_DELAY = 120;

StateManager.prototype.start = function() {
// Start with inactive state.
this._isActive = false;
Expand Down Expand Up @@ -75,6 +81,13 @@ StateManager.prototype._updateActiveState = function(active) {
// since eventually IMEngine will be switched.
this.app.inputMethodManager.updateInputContextData();

// Before switching away, clean up anything pending in the previous
// active layout.
// We however don't clear active target here because the user might
// want to input continuously between two layouts.
this.app.candidatePanelManager.hideFullPanel();
this.app.candidatePanelManager.updateCandidates([]);

// Perform the following async actions with a promise chain.
// Switch the layout,
this.app.layoutManager.switchCurrentLayout(this._layoutName)
Expand All @@ -97,29 +110,53 @@ StateManager.prototype._updateActiveState = function(active) {
this.app.settingsPromiseManager.set({
'keyboard.current': undefined
});
// Finish off anything pending except removing the rendering --
// input management need it for transition.
this.app.candidatePanelManager.hideFullPanel();
this.app.candidatePanelManager.updateCandidates([]);
this.app.targetHandlersManager.activeTargetsManager.clearAllTargets();
this.app.inputMethodManager.switchCurrentIMEngine('default')
// ... make sure error is not silently ignored.
.catch(function(e) { (e !== undefined) && console.error(e); });

var imManager = this.app.inputMethodManager;

// Finish off anything pending except removing the rendering after a delay
// -- input management need it for transition.
this._delayDeactivate()
// ... cancel everything
.then(function() {
this.app.candidatePanelManager.hideFullPanel();
this.app.candidatePanelManager.updateCandidates([]);
this.app.targetHandlersManager.activeTargetsManager.clearAllTargets();
}.bind(this))
// ... switch away IMEngine
.then(imManager.switchCurrentIMEngine.bind(imManager, 'default'))
// ... make sure error is not silently ignored.
.catch(function(e) { (e !== undefined) && console.error(e); });
}

this._isActive = active;
};

StateManager.prototype._delayDeactivate = function() {
var p = new Promise(function(resolve, reject) {
setTimeout(function() {
// If state has switched to active, do not deactivate the keyboard.
if (this._isActive) {
console.warn('StateManager: Reactivated before DEACTIVATE_DELAY.');
reject();
}

resolve();
}.bind(this), this.DEACTIVATE_DELAY);
}.bind(this));

return p;
};

StateManager.prototype._preloadLayout = function() {
var layoutLoader = this.app.layoutManager.loader;
var p = layoutLoader.getLayoutAsync(this._layoutName).then(function(layout) {
var imEngineName = layout.imEngine;
var imEngineLoader = this.app.inputMethodManager.loader;
// Ask the loader to start loading IMEngine
if (imEngineName) {
var p = imEngineLoader.getInputMethodAsync(imEngineName);
return p;
}
var imEngineName = layout.imEngine;
var imEngineLoader = this.app.inputMethodManager.loader;
// Ask the loader to start loading IMEngine
if (imEngineName) {
var p = imEngineLoader.getInputMethodAsync(imEngineName);
return p;
}
}.bind(this)).catch(function(e) {
if (e !== undefined) {
console.error(e);
Expand Down Expand Up @@ -158,11 +195,6 @@ StateManager.prototype._updateLayoutRendering = function() {
}
this.app.perfTimer.startTimer('_updateLayoutRendering');

// Clean up anything pending in the previous active layout.
this.app.candidatePanelManager.hideFullPanel();
this.app.candidatePanelManager.updateCandidates([]);
this.app.targetHandlersManager.activeTargetsManager.clearAllTargets();

// everything.me uses this setting to improve searches,
// but they really shouldn't.
this.app.settingsPromiseManager.set({
Expand Down

0 comments on commit 0535f7a

Please sign in to comment.