Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
186 lines
6.4 KiB
JavaScript
Executable file
186 lines
6.4 KiB
JavaScript
Executable file
/* global IAC_API_WAKEUP_REASON_TRY_DISABLE */
|
|
|
|
'use strict';
|
|
|
|
define(function(require) {
|
|
var SettingsUtils = require('modules/settings_utils');
|
|
var SettingsListener = require('shared/settings_listener');
|
|
var SettingsHelper = require('shared/settings_helper');
|
|
var wakeUpFindMyDevice = require('shared/findmydevice_iac_api');
|
|
var LazyLoader = require('shared/lazy_loader');
|
|
|
|
var FindMyDevice = function() {
|
|
// When the FxA login callback is called, we need to know if the
|
|
// login process began with the user clicking our login button
|
|
// since in that case we also want to enable Find My Device if it's
|
|
// not already registered.
|
|
this._interactiveLogin = false;
|
|
|
|
this._enabledHelper = SettingsHelper('findmydevice.enabled');
|
|
this._loggedInHelper = SettingsHelper('findmydevice.logged-in');
|
|
this._registeredHelper = SettingsHelper('findmydevice.registered');
|
|
|
|
this._boundSetTracked = this._boundSetTracked ||
|
|
this._setTracked.bind(this);
|
|
this._boundSetEnabled = this._boundSetEnabled ||
|
|
this._setEnabled.bind(this);
|
|
this._boundSetCanDisable = this._boundSetCanDisable ||
|
|
this._setCanDisable.bind(this);
|
|
this._boundLoginClick = this._boundLoginClick ||
|
|
this._onLoginClick.bind(this);
|
|
this._boundCheckboxChanged = this._boundCheckboxChanged ||
|
|
this._onCheckboxChanged.bind(this);
|
|
};
|
|
|
|
FindMyDevice.prototype = {
|
|
onInit: function fmd_init(elements) {
|
|
this._elements = elements;
|
|
|
|
// The app name may overflow the header width in some locales; try to
|
|
// shrink it. Bug 1087441
|
|
SettingsUtils.runHeaderFontFit(this._elements.header);
|
|
|
|
LazyLoader.getJSON('/resources/findmydevice.json').then((data) => {
|
|
SettingsListener.observe('findmydevice.logged-in', false,
|
|
this._togglePanel.bind(this));
|
|
|
|
navigator.mozId.watch({
|
|
wantIssuer: 'firefox-accounts',
|
|
audience: data.api_url,
|
|
onlogin: this._onChangeLoginState.bind(this, true),
|
|
onlogout: this._onChangeLoginState.bind(this, false),
|
|
onready: () => {
|
|
this._elements.loginButton.removeAttribute('disabled');
|
|
console.log('Find My Device: onready fired');
|
|
},
|
|
onerror: (err) => {
|
|
console.error('Find My Device: onerror fired: ' + err);
|
|
this._interactiveLogin = false;
|
|
this._elements.loginButton.removeAttribute('disabled');
|
|
var errorName = JSON.parse(err).name;
|
|
if (errorName !== 'OFFLINE') {
|
|
if (errorName === 'UNVERIFIED_ACCOUNT') {
|
|
this._elements.unverifiedError.hidden = false;
|
|
this._elements.login.hidden = true;
|
|
}
|
|
this._loggedInHelper.set(false);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
},
|
|
onBeforeShow: function fmd_onBeforeShow() {
|
|
SettingsListener.observe('findmydevice.tracking', false,
|
|
this._boundSetTracked);
|
|
SettingsListener.observe('findmydevice.enabled', false,
|
|
this._boundSetEnabled);
|
|
SettingsListener.observe('findmydevice.can-disable', true,
|
|
this._boundSetCanDisable);
|
|
|
|
this._elements.loginButton.addEventListener('click',
|
|
this._boundLoginClick);
|
|
this._elements.checkbox.addEventListener('change',
|
|
this._boundCheckboxChanged);
|
|
},
|
|
onBeforeHide: function fmd_onBeforeHide() {
|
|
SettingsListener.unobserve('findmydevice.tracking',
|
|
this._boundSetTracked);
|
|
SettingsListener.unobserve('findmydevice.enabled',
|
|
this._boundSetEnabled);
|
|
SettingsListener.unobserve('findmydevice.can-disable',
|
|
this._boundSetCanDisable);
|
|
|
|
this._elements.loginButton.removeEventListener('click',
|
|
this._boundLoginClick);
|
|
this._elements.checkbox.removeEventListener('change',
|
|
this._boundCheckboxChanged);
|
|
},
|
|
|
|
_onLoginClick: function fmd_on_login_click(e) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
if (this._elements.loginButton.disabled) {
|
|
return;
|
|
}
|
|
if (!window.navigator.onLine) {
|
|
document.l10n.formatValue('findmydevice-enable-network').then(
|
|
(msg) => window.alert(msg));
|
|
return;
|
|
}
|
|
this._interactiveLogin = true;
|
|
navigator.mozId.request({
|
|
oncancel: () => {
|
|
this._interactiveLogin = false;
|
|
console.log('Find My Device: oncancel fired');
|
|
}
|
|
});
|
|
},
|
|
|
|
_setEnabled: function fmd_set_enabled(value) {
|
|
this._elements.checkbox.checked = value;
|
|
this._elements.status.hidden = !value;
|
|
},
|
|
|
|
_setTracked: function fmd_set_tracked(value) {
|
|
this._elements.status.setAttribute('data-l10n-id',
|
|
value ? 'findmydevice-active-tracking' : 'findmydevice-not-tracking');
|
|
},
|
|
|
|
_setCanDisable: function fmd_set_can_disable(value) {
|
|
this._elements.checkbox.disabled = !value;
|
|
},
|
|
|
|
_togglePanel: function fmd_toggle_panel(loggedIn) {
|
|
this._elements.signin.hidden = loggedIn;
|
|
this._elements.settings.hidden = !loggedIn;
|
|
},
|
|
|
|
_onChangeLoginState: function fmd_on_change_login_state(loggedIn) {
|
|
console.log('settings, logged in: ' + loggedIn);
|
|
|
|
if (this._interactiveLogin) {
|
|
this._registeredHelper.get(registered => {
|
|
if (!registered) {
|
|
this._enabledHelper.set(true);
|
|
}
|
|
});
|
|
}
|
|
|
|
this._interactiveLogin = false;
|
|
|
|
// Bug 1164713: Force logged in status in case of stale setting value
|
|
this._loggedInHelper.set(loggedIn);
|
|
|
|
this._elements.unverifiedError.hidden = true;
|
|
this._elements.login.hidden = false;
|
|
},
|
|
|
|
_onCheckboxChanged: function fmd_on_checkbox_changed(event) {
|
|
event.preventDefault();
|
|
|
|
if (!window.navigator.onLine) {
|
|
// XXX(ggp) do this later so that the visual change in the
|
|
// checkbox is properly prevented.
|
|
// formatValue is asynchronous so we don't need an artificial
|
|
// setTimeout here.
|
|
document.l10n.formatValue('findmydevice-enable-network').then(
|
|
msg => window.alert(msg));
|
|
return;
|
|
}
|
|
|
|
this._elements.checkbox.disabled = true;
|
|
|
|
if (this._elements.checkbox.checked === false) {
|
|
wakeUpFindMyDevice(IAC_API_WAKEUP_REASON_TRY_DISABLE);
|
|
} else {
|
|
this._enabledHelper.set(true, () => {
|
|
this._elements.checkbox.disabled = false;
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
return function ctor_findmydevice() {
|
|
return new FindMyDevice();
|
|
};
|
|
});
|