Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
227 lines
6.4 KiB
JavaScript
227 lines
6.4 KiB
JavaScript
'use strict';
|
|
|
|
/* global MozActivity, Sanitizer */
|
|
(function(exports) {
|
|
/**
|
|
* ImeMenu displays a list of currently enabled IMEs in an overlay.
|
|
* @class ImeMenu
|
|
* @param {Array} listItems An array of objects to display.
|
|
* @param {String} title L10n ID of the the content of the header.
|
|
* @param {Function} successCb Called when the user selects an option.
|
|
* @param {Function} cancelCb Called when the menu is cancelled.
|
|
*/
|
|
function ImeMenu(listItems, title, successCb, cancelCb) {
|
|
this.onselected = successCb || function() {};
|
|
this.oncancel = cancelCb || function() {};
|
|
this.listItems = listItems;
|
|
this.title = title;
|
|
}
|
|
|
|
ImeMenu.prototype = {
|
|
/**
|
|
* Start the ImeMenu instance
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
start: function() {
|
|
this.initUI();
|
|
},
|
|
|
|
/**
|
|
* Builds dom and adds event listeners
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
initUI: function() {
|
|
var dummy = document.createElement('div');
|
|
|
|
dummy.innerHTML = Sanitizer.unwrapSafeHTML(this.imeMenuView({
|
|
title: this.title
|
|
}));
|
|
this.container = dummy.firstElementChild;
|
|
|
|
// We have a menu with all the options
|
|
this.menu = this.container.querySelector('.ime-menu-list');
|
|
this.buildMenu(this.listItems);
|
|
|
|
// We append to System app (actually to '#screen')
|
|
document.getElementById('screen').appendChild(this.container);
|
|
|
|
this.container.addEventListener('submit', this);
|
|
this.container.addEventListener('click', this);
|
|
|
|
window.addEventListener('attentionopened', this, true);
|
|
window.addEventListener('screenchange', this, true);
|
|
window.addEventListener('home', this);
|
|
window.addEventListener('holdhome', this);
|
|
|
|
this.container.addEventListener('mousedown', this.preventFocusChange);
|
|
|
|
window.dispatchEvent(new CustomEvent('imemenushow'));
|
|
},
|
|
|
|
/**
|
|
* Removes the dom and stops event listeners
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
stop: function() {
|
|
document.getElementById('screen').removeChild(this.container);
|
|
|
|
window.removeEventListener('attentionopened', this, true);
|
|
window.removeEventListener('screenchange', this, true);
|
|
window.removeEventListener('home', this);
|
|
window.removeEventListener('holdhome', this);
|
|
|
|
this.container.removeEventListener('mousedown', this.preventFocusChange);
|
|
},
|
|
|
|
/**
|
|
* Returns the view for the ime menu.
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
imeMenuView: function({title, cancelLabel}) {
|
|
return Sanitizer.createSafeHTML `<form role="dialog"
|
|
data-type="value-selector" class="ime-menu value-selector-container"
|
|
data-z-index-level="action-menu">
|
|
<section>
|
|
<h1 data-l10n-id="${title}"></h1>
|
|
<ol class="value-selector-options-container ime-menu-list"
|
|
aria-multiselectable="false" role="listbox">
|
|
</ol>
|
|
</section>
|
|
<menu class="ime-menu-button-container">
|
|
<button class="ime-menu-button" data-type="cancel"
|
|
data-action="cancel" data-l10n-id="cancel"></button>
|
|
</menu>
|
|
</div>`;
|
|
},
|
|
|
|
/**
|
|
* Returns the view for a menu item.
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
menuItemView: function({name, nameL10nId, appName, layoutId, selected}) {
|
|
return Sanitizer.createSafeHTML `
|
|
<li role="option" aria-selected="${selected}"
|
|
data-id="${layoutId}">
|
|
<label role="presentation">
|
|
<span class="item-label" data-l10n-id="${nameL10nId}">${name}</span>
|
|
<span class="item-note">${appName}</span>
|
|
</label>
|
|
</li>`;
|
|
},
|
|
|
|
/**
|
|
* Builds the dom for the menu.
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
buildMenu: function(items) {
|
|
var menuList = [];
|
|
items.forEach(function traveseItems(item) {
|
|
menuList.push(this.menuItemView({
|
|
name: item.name,
|
|
nameL10nId: item.nameL10nId,
|
|
appName: item.appName,
|
|
layoutId: item.value.toString(),
|
|
selected: item.selected ? 'true' : 'false'
|
|
}));
|
|
}, this);
|
|
this.menu.innerHTML = Sanitizer.unwrapSafeHTML(...menuList);
|
|
},
|
|
|
|
/**
|
|
* Hides the ImeMenu.
|
|
* @memberof ImeMenu.prototype
|
|
* @param {Function} callback The callback to call after hiding.
|
|
*/
|
|
hide: function(callback) {
|
|
this.stop();
|
|
if (callback && typeof callback === 'function') {
|
|
setTimeout(callback);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* When IME switcher shows, prevent the keyboard focus getting changed.
|
|
* @memberof ImeMenu.prototype
|
|
* @param {DOMEvent} evt The event.
|
|
*/
|
|
preventFocusChange: function(evt) {
|
|
evt.preventDefault();
|
|
},
|
|
|
|
/**
|
|
* General event handler interface.
|
|
* Handles submission and cancellation events.
|
|
* @memberof ImeMenu.prototype
|
|
* @param {DOMEvent} evt The event.
|
|
*/
|
|
handleEvent: function(evt) {
|
|
var target = evt.target;
|
|
var type = evt.type;
|
|
switch (type) {
|
|
case 'submit':
|
|
evt.preventDefault();
|
|
break;
|
|
case 'screenchange':
|
|
if (!evt.detail.screenEnabled) {
|
|
this.hide();
|
|
this.oncancel();
|
|
}
|
|
break;
|
|
|
|
case 'click':
|
|
evt.preventDefault();
|
|
var action = target.dataset.action;
|
|
if (action) {
|
|
if (action === 'cancel') {
|
|
this.hide();
|
|
this.oncancel();
|
|
return;
|
|
}
|
|
|
|
if (action === 'settings') {
|
|
this.hide();
|
|
this.launchSettings();
|
|
return;
|
|
}
|
|
}
|
|
|
|
var id = target.dataset.id;
|
|
if (!id) {
|
|
return;
|
|
}
|
|
id = parseInt(id);
|
|
this.hide(this.onselected.bind(this, id));
|
|
break;
|
|
|
|
case 'home':
|
|
case 'holdhome':
|
|
this.hide();
|
|
this.oncancel();
|
|
break;
|
|
|
|
case 'attentionopened':
|
|
this.hide();
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* To lauch the settings via web activity.
|
|
* @memberof ImeMenu.prototype
|
|
*/
|
|
launchSettings: function() {
|
|
var activity = new MozActivity({
|
|
name: 'configure',
|
|
data: {
|
|
target: 'device',
|
|
section: 'keyboard'
|
|
}
|
|
});
|
|
activity.onerror = function() {
|
|
console.error('Failed to invoke keyboard settings.');
|
|
};
|
|
}
|
|
};
|
|
|
|
exports.ImeMenu = ImeMenu;
|
|
}(window));
|