diff options
Diffstat (limited to 'mobile/android/modules/Accounts.jsm')
-rw-r--r-- | mobile/android/modules/Accounts.jsm | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/mobile/android/modules/Accounts.jsm b/mobile/android/modules/Accounts.jsm new file mode 100644 index 000000000..a611f3c58 --- /dev/null +++ b/mobile/android/modules/Accounts.jsm @@ -0,0 +1,178 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +this.EXPORTED_SYMBOLS = ["Accounts"]; + +const { utils: Cu } = Components; + +Cu.import("resource://gre/modules/Deprecated.jsm"); /*global Deprecated */ +Cu.import("resource://gre/modules/Messaging.jsm"); /*global Messaging */ +Cu.import("resource://gre/modules/Promise.jsm"); /*global Promise */ +Cu.import("resource://gre/modules/Services.jsm"); /*global Services */ + +/** + * A promise-based API for querying the existence of Sync accounts, + * and accessing the Sync setup wizard. + * + * Usage: + * + * Cu.import("resource://gre/modules/Accounts.jsm"); + * Accounts.anySyncAccountsExist().then( + * (exist) => { + * console.log("Accounts exist? " + exist); + * if (!exist) { + * Accounts.launchSetup(); + * } + * }, + * (err) => { + * console.log("We failed so hard."); + * } + * ); + */ +var Accounts = Object.freeze({ + _accountsExist: function (kind) { + return Messaging.sendRequestForResult({ + type: "Accounts:Exist", + kind: kind + }).then(data => data.exists); + }, + + firefoxAccountsExist: function () { + return this._accountsExist("fxa"); + }, + + syncAccountsExist: function () { + Deprecated.warning("The legacy Sync account type has been removed from Firefox for Android. " + + "Please use `firefoxAccountsExist` instead.", + "https://developer.mozilla.org/en-US/Add-ons/Firefox_for_Android/API/Accounts.jsm"); + return Promise.resolve(false); + }, + + anySyncAccountsExist: function () { + return this._accountsExist("any"); + }, + + /** + * Fire-and-forget: open the Firefox accounts activity, which + * will be the Getting Started screen if FxA isn't yet set up. + * + * Optional extras are passed, as a JSON string, to the Firefox + * Account Getting Started activity in the extras bundle of the + * activity launch intent, under the key "extras". + * + * There is no return value from this method. + */ + launchSetup: function (extras) { + Messaging.sendRequest({ + type: "Accounts:Create", + extras: extras + }); + }, + + _addDefaultEndpoints: function (json) { + let newData = Cu.cloneInto(json, {}, { cloneFunctions: false }); + let associations = { + authServerEndpoint: 'identity.fxaccounts.auth.uri', + profileServerEndpoint: 'identity.fxaccounts.remote.profile.uri', + tokenServerEndpoint: 'identity.sync.tokenserver.uri' + }; + for (let key in associations) { + newData[key] = newData[key] || Services.urlFormatter.formatURLPref(associations[key]); + } + return newData; + }, + + /** + * Create a new Android Account corresponding to the given + * fxa-content-server "login" JSON datum. The new account will be + * in the "Engaged" state, and will start syncing immediately. + * + * It is an error if an Android Account already exists. + * + * Returns a Promise that resolves to a boolean indicating success. + */ + createFirefoxAccountFromJSON: function (json) { + return Messaging.sendRequestForResult({ + type: "Accounts:CreateFirefoxAccountFromJSON", + json: this._addDefaultEndpoints(json) + }); + }, + + /** + * Move an existing Android Account to the "Engaged" state with the given + * fxa-content-server "login" JSON datum. The account will (re)start + * syncing immediately, unless the user has manually configured the account + * to not Sync. + * + * It is an error if no Android Account exists. + * + * Returns a Promise that resolves to a boolean indicating success. + */ + updateFirefoxAccountFromJSON: function (json) { + return Messaging.sendRequestForResult({ + type: "Accounts:UpdateFirefoxAccountFromJSON", + json: this._addDefaultEndpoints(json) + }); + }, + + /** + * Notify that profile for Android Account has updated. + * The account will re-fetch the profile image. + * + * It is an error if no Android Account exists. + * + * There is no return value from this method. + */ + notifyFirefoxAccountProfileChanged: function () { + Messaging.sendRequest({ + type: "Accounts:ProfileUpdated", + }); + }, + + /** + * Fetch information about an existing Android Firefox Account. + * + * Returns a Promise that resolves to null if no Android Firefox Account + * exists, or an object including at least a string-valued 'email' key. + */ + getFirefoxAccount: function () { + return Messaging.sendRequestForResult({ + type: "Accounts:Exist", + kind: "fxa", + }).then(data => { + if (!data || !data.exists) { + return null; + } + delete data.exists; + return data; + }); + }, + + /** + * Delete an existing Android Firefox Account. + * + * It is an error if no Android Account exists. + * + * Returns a Promise that resolves to a boolean indicating success. + */ + deleteFirefoxAccount: function () { + return Messaging.sendRequestForResult({ + type: "Accounts:DeleteFirefoxAccount", + }); + }, + + showSyncPreferences: function () { + // Only show Sync preferences of an existing Android Account. + return Accounts.getFirefoxAccount().then(account => { + if (!account) { + throw new Error("Can't show Sync preferences of non-existent Firefox Account!"); + } + return Messaging.sendRequestForResult({ + type: "Accounts:ShowSyncPreferences" + }); + }); + } +}); |