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 #14488 from RudyLu/keyboard/Bug888253-keyboard_set…
Browse files Browse the repository at this point in the history
…tings_migration

 Bug 888253 - Settings data migration for keyboard layouts.
r=gnarf, gary, yuren(cherry picked from commit 51ed5c6)
a=koi+

Conflicts:
	build/settings.js
  • Loading branch information
RudyLu committed Dec 12, 2013
1 parent 6d02039 commit 25b1fa6
Show file tree
Hide file tree
Showing 3 changed files with 252 additions and 38 deletions.
89 changes: 88 additions & 1 deletion apps/system/test/unit/keyboard_helper_test.js
Expand Up @@ -84,6 +84,32 @@ suite('KeyboardHelper', function() {
defaultSettings['default'][keyboardAppManifestURL] = {en: true, number: true};
defaultSettings.enabled = defaultSettings['default'];

var DEPRECATE_KEYBOARD_SETTINGS = {
en: 'keyboard.layouts.english',
'en-Dvorak': 'keyboard.layouts.dvorak',
cs: 'keyboard.layouts.czech',
fr: 'keyboard.layouts.french',
de: 'keyboard.layouts.german',
hu: 'keyboard.layouts.hungarian',
nb: 'keyboard.layouts.norwegian',
my: 'keyboard.layouts.myanmar',
sl: 'keyboard.layouts.slovak',
tr: 'keyboard.layouts.turkish',
ro: 'keyboard.layouts.romanian',
ru: 'keyboard.layouts.russian',
ar: 'keyboard.layouts.arabic',
he: 'keyboard.layouts.hebrew',
'zh-Hant-Zhuyin': 'keyboard.layouts.zhuyin',
'zh-Hans-Pinyin': 'keyboard.layouts.pinyin',
el: 'keyboard.layouts.greek',
'jp-kanji': 'keyboard.layouts.japanese',
pl: 'keyboard.layouts.polish',
'pt-BR': 'keyboard.layouts.portuguese',
sr: 'keyboard.layouts.serbian',
es: 'keyboard.layouts.spanish',
ca: 'keyboard.layouts.catalan'
};

function trigger(event) {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(event, true, false, {});
Expand Down Expand Up @@ -128,11 +154,19 @@ suite('KeyboardHelper', function() {

test('requests initial settings', function() {
var requests = MockNavigatorSettings.mRequests;
assert.equal(requests.length, 3);
assert.equal(requests.length, 26);
assert.ok(DEFAULT_KEY in requests[0].result, 'requested defaults');
assert.ok(ENABLED_KEY in requests[1].result, 'requested enabled');
assert.ok(THIRD_PARTY_APP_ENABLED_KEY in requests[2].result,
'requested 3rd-party keyboard app enabled');

var i = 0;
for (var key in DEPRECATE_KEYBOARD_SETTINGS) {
assert.ok(DEPRECATE_KEYBOARD_SETTINGS[key] in requests[3 + i].result,
'requested deprecated settings - ' +
DEPRECATE_KEYBOARD_SETTINGS[key]);
i++;
}
});

suite('getApps', function() {
Expand Down Expand Up @@ -730,6 +764,59 @@ suite('KeyboardHelper', function() {
});
});

suite('migrate old settings', function() {
var expectedSettings = {
'default': {},
enabled: {}
};

suite('old settings: cs enabled', function() {
setup(function() {
this.sinon.stub(KeyboardHelper, 'saveToSettings');
MockNavigatorSettings.mRequests[3].
result[DEPRECATE_KEYBOARD_SETTINGS.en] = false;
MockNavigatorSettings.mRequests[5].
result[DEPRECATE_KEYBOARD_SETTINGS.cs] = true;
MockNavigatorSettings.mReplyToRequests();
});

test('default settings loaded with cs', function() {
expectedSettings['enabled'][keyboardAppManifestURL] =
{cs: true, number: true};

assert.deepEqual(KeyboardHelper.settings.enabled,
expectedSettings.enabled);
});

test('saves settings', function() {
assert.isTrue(KeyboardHelper.saveToSettings.called);
});
});

suite('old settings: serbian enabled', function() {
setup(function() {
this.sinon.stub(KeyboardHelper, 'saveToSettings');
MockNavigatorSettings.mRequests[3].
result[DEPRECATE_KEYBOARD_SETTINGS.en] = false;
MockNavigatorSettings.mRequests[23].
result[DEPRECATE_KEYBOARD_SETTINGS.sr] = true;
MockNavigatorSettings.mReplyToRequests();
});

test('default settings loaded with cs', function() {
expectedSettings['enabled'][keyboardAppManifestURL] =
{'sr-Cyrl': true, 'sr-Latn': true, number: true};

assert.deepEqual(KeyboardHelper.settings.enabled,
expectedSettings.enabled);
});

test('saves settings', function() {
assert.isTrue(KeyboardHelper.saveToSettings.called);
});
});
});

suite('default settings', function() {
setup(function() {
this.sinon.spy(KeyboardHelper, 'saveToSettings');
Expand Down
36 changes: 0 additions & 36 deletions build/settings.js
Expand Up @@ -162,28 +162,6 @@ function execute() {
'icc.toneDefaultTimeout': 5000,
'icc.goBackTimeout': 1000,
'icc.selectTimeout': 150000,
'keyboard.layouts.english': true,
'keyboard.layouts.dvorak': false,
'keyboard.layouts.czech': false,
'keyboard.layouts.french': false,
'keyboard.layouts.german': false,
'keyboard.layouts.hungarian': false,
'keyboard.layouts.norwegian': false,
'keyboard.layouts.slovak': false,
'keyboard.layouts.turkish': false,
'keyboard.layouts.romanian': false,
'keyboard.layouts.russian': false,
'keyboard.layouts.arabic': false,
'keyboard.layouts.hebrew': false,
'keyboard.layouts.zhuyin': false,
'keyboard.layouts.pinyin': false,
'keyboard.layouts.greek': false,
'keyboard.layouts.japanese': false,
'keyboard.layouts.polish': false,
'keyboard.layouts.portuguese': false,
'keyboard.layouts.serbian': false,
'keyboard.layouts.spanish': false,
'keyboard.layouts.catalan': false,
'keyboard.vibration': false,
'keyboard.clicksound': false,
'keyboard.autocorrect': true,
Expand Down Expand Up @@ -314,20 +292,6 @@ function execute() {
}

settings['language.current'] = config.GAIA_DEFAULT_LOCALE;
let file = utils.Gaia.sharedFolder.clone();
file.append('resources');
file.append('keyboard_layouts.json');
let keyboard_layouts_res = utils.getJSON(file);
let keyboard_layouts = keyboard_layouts_res['layout'];
let keyboard_nonLatins = keyboard_layouts_res['nonLatin'];
let default_layout;
if (config.GAIA_DEFAULT_LOCALE in keyboard_layouts) {
default_layout = keyboard_layouts[config.GAIA_DEFAULT_LOCALE];
if (!(config.GAIA_DEFAULT_LOCALE in keyboard_nonLatins)) {
settings['keyboard.layouts.english'] = false;
}
settings['keyboard.layouts.' + default_layout] = true;
}
settings['devtools.debugger.remote-enabled'] = config.REMOTE_DEBUGGER == true;


Expand Down
165 changes: 164 additions & 1 deletion shared/js/keyboard_helper.js
Expand Up @@ -27,6 +27,36 @@ var SETTINGS_KEYS = {
THIRD_PARTY_APP_ENABLED: 'keyboard.3rd-party-app.enabled'
};

var DEPRECATE_KEYBOARD_SETTINGS = {
en: 'keyboard.layouts.english',
'en-Dvorak': 'keyboard.layouts.dvorak',
cs: 'keyboard.layouts.czech',
fr: 'keyboard.layouts.french',
de: 'keyboard.layouts.german',
hu: 'keyboard.layouts.hungarian',
nb: 'keyboard.layouts.norwegian',
my: 'keyboard.layouts.myanmar',
sl: 'keyboard.layouts.slovak',
tr: 'keyboard.layouts.turkish',
ro: 'keyboard.layouts.romanian',
ru: 'keyboard.layouts.russian',
ar: 'keyboard.layouts.arabic',
he: 'keyboard.layouts.hebrew',
'zh-Hant-Zhuyin': 'keyboard.layouts.zhuyin',
'zh-Hans-Pinyin': 'keyboard.layouts.pinyin',
el: 'keyboard.layouts.greek',
'jp-kanji': 'keyboard.layouts.japanese',
pl: 'keyboard.layouts.polish',
'pt-BR': 'keyboard.layouts.portuguese',
sr: 'keyboard.layouts.serbian',
es: 'keyboard.layouts.spanish',
ca: 'keyboard.layouts.catalan'
};

var MULTI_LAYOUT_MAP = {
sr: ['sr-Cyrl', 'sr-Latn']
};

// In order to provide default defaults, we need to know the default keyboard
var defaultKeyboardManifestURL =
'app://keyboard.gaiamobile.org/manifest.webapp';
Expand Down Expand Up @@ -132,7 +162,6 @@ function kh_updateWatchers(reason) {
var waitingForSettings = [];
var loadedSettings = new Set();


/**
* Tracks the number of settings loaded and calls the callbacks
*/
Expand Down Expand Up @@ -240,6 +269,62 @@ function kh_parseEnabled() {
}
}

/**
* Parse and migrate the result for the deprecated settings (v1.1) for enabled
* layouts.
*/
function kh_migrateDeprecatedSettings(deprecatedSettings) {
var settingEntry = DEPRECATE_KEYBOARD_SETTINGS['en'];

// No need to do migration if the deprecated settings are not available
if (deprecatedSettings[settingEntry] == undefined) {
return;
}

// reset the enabled layouts
currentSettings.enabledLayouts[defaultKeyboardManifestURL] = {
number: true
};

var hasEnabledLayout = false;
for (var key in DEPRECATE_KEYBOARD_SETTINGS) {
settingEntry = DEPRECATE_KEYBOARD_SETTINGS[key];
// this layout was set as enabled in the old settings
if (deprecatedSettings[settingEntry]) {
hasEnabledLayout = true;

if (key in MULTI_LAYOUT_MAP) {
MULTI_LAYOUT_MAP[key].forEach(function enableLayout(layoutId) {
map2dSet.call(currentSettings.enabledLayouts,
defaultKeyboardManifestURL, layoutId);
});
} else {
map2dSet.call(currentSettings.enabledLayouts,
defaultKeyboardManifestURL, key);
}
}
}

// None of the layouts has been set enabled, so enable English by default
if (!hasEnabledLayout) {
map2dSet.call(currentSettings.enabledLayouts,
defaultKeyboardManifestURL, 'en');
}

// Clean up all the deprecated settings
var deprecatedSettingsQuery = {};
for (var key in DEPRECATE_KEYBOARD_SETTINGS) {
// the deprecated setting entry, e.g. keyboard.layout.english
settingEntry = DEPRECATE_KEYBOARD_SETTINGS[key];

// Set the default value for each entry
deprecatedSettingsQuery[settingEntry] = null;
}
window.navigator.mozSettings.createLock().set(deprecatedSettingsQuery);

KeyboardHelper.saveToSettings();
}

/**
* JSON loader
*/
Expand All @@ -258,6 +343,72 @@ function kh_loadJSON(href, callback) {
xhr.send();
}

//
// getSettings: Query the value of multiple settings at once.
//
// settings is an object whose property names are the settings to query
// and whose property values are the default values to use if no such
// setting is found. This function will create a setting lock and
// request the value of each of the specified settings. Once it receives
// a response to all of the queries, it passes all the settings values to
// the specified callback function. The argument to the callback function
// is an object just like the settings object, where the property name is
// the setting name and the property value is the setting value (or the
// default value if the setting was not found).
//
function kh_getMultiSettings(settings, callback) {
var results = {};
try {
var lock = navigator.mozSettings.createLock();
}
catch (e) {
// If settings is broken, just return the default values
console.warn('Exception in mozSettings.createLock():', e,
'\nUsing default values');
for (var p in settings)
results[p] = settings[p];
callback(results);
}
var settingNames = Object.keys(settings);
var numSettings = settingNames.length;
var numResults = 0;

for (var i = 0; i < numSettings; i++) {
requestSetting(settingNames[i]);
}

function requestSetting(name) {
try {
var request = lock.get(name);
}
catch (e) {
console.warn('Exception querying setting', name, ':', e,
'\nUsing default value');
recordResult(name, settings[name]);
return;
}
request.onsuccess = function() {
var value = request.result[name];
if (value === undefined) {
value = settings[name]; // Use the default value
}
recordResult(name, value);
};
request.onerror = function(evt) {
console.warn('Error querying setting', name, ':', evt.error);
recordResult(name, settings[name]);
};
}

function recordResult(name, value) {
results[name] = value;
numResults++;
if (numResults === numSettings) {
callback(results);
}
}
}

/**
* Creates an object that describes a keyboard layout. The objects prototype
* will give it accessors for 'default' and 'enabled' that will read or change
Expand Down Expand Up @@ -335,6 +486,18 @@ var KeyboardHelper = exports.KeyboardHelper = {
kh_getSettings();
settings.addObserver(SETTINGS_KEYS.ENABLED, kh_getSettings);
settings.addObserver(SETTINGS_KEYS.DEFAULT, kh_getSettings);

// read deprecated settings
var deprecatedSettingsQuery = {};
for (var key in DEPRECATE_KEYBOARD_SETTINGS) {
// the deprecated setting entry, e.g. keyboard.layout.english
var settingEntry = DEPRECATE_KEYBOARD_SETTINGS[key];

// Set the default value for each entry
deprecatedSettingsQuery[settingEntry] = undefined;
}
kh_getMultiSettings(deprecatedSettingsQuery,
kh_migrateDeprecatedSettings);
}

window.addEventListener('applicationinstallsuccess', this);
Expand Down

0 comments on commit 25b1fa6

Please sign in to comment.