diff --git a/main.js b/main.js index ee5f535..2e903d6 100644 --- a/main.js +++ b/main.js @@ -51,13 +51,13 @@ define(function (require, exports, module) { var NativeApp = brackets.getModule("utils/NativeApp"); var FileSystem = brackets.getModule("filesystem/FileSystem"); var Panel = require("./src/Panel"); - var PreferencesManager = brackets.getModule("preferences/PreferencesManager"); var ProxyProvider = require("./src/ProxyProvider"); var Strings = require("./src/strings"); var UI = require("./src/UI"); var Update = require("./src/Update"); var Usage = require("./src/Usage"); var StringUtils = brackets.getModule("utils/StringUtils"); + var Preferences = require("./src/Preferences"); var $exports = $(exports); @@ -103,7 +103,6 @@ define(function (require, exports, module) { var _enabled = false; var _mode = DEFAULT_MODE; - var _prefs; function _enable() { $exports.triggerHandler("enable"); @@ -113,10 +112,14 @@ define(function (require, exports, module) { $exports.triggerHandler("disable"); } - function _toggleEnabled() { + function _toggleEnabled(enabled) { // TODO: disable or enable immediately - _enabled = !_enabled; - _prefs.setValue("enabled", _enabled); + if (enabled !== undefined) { // set to a given state + _enabled = enabled; + } else { + _enabled = !_enabled; + } + Preferences.set("enabled", _enabled, true); _updateMenuStates(); if (_enabled) { @@ -129,7 +132,7 @@ define(function (require, exports, module) { function _setMode(modeName) { // TODO: warn user that connection will need to be restarted _mode = _modes[modeName] || DEFAULT_MODE; - _prefs.setValue("mode", _mode.name); + Preferences.set("mode", _mode.name, true); _updateMenuStates(); } @@ -206,9 +209,8 @@ define(function (require, exports, module) { } function _loadPreferences() { - _prefs = PreferencesManager.getPreferenceStorage("com.adobe.theseus", { enabled: true, mode: "static" }); - _enabled = _prefs.getValue("enabled"); - _mode = _modes[_prefs.getValue("mode")] || DEFAULT_MODE; + _enabled = Preferences.get("enabled"); + _mode = _modes[Preferences.get("mode")] || DEFAULT_MODE; } function _setupMenu() { @@ -329,6 +331,13 @@ define(function (require, exports, module) { } }); + $(Preferences).on("change.enabled", function () { + _toggleEnabled(Preferences.get("enabled")); + }); + $(Preferences).on("change.mode", function () { + _setMode(Preferences.get("mode")); + }); + if (_enabled) { // enable now if enabled in preferences _enable(); } diff --git a/package.json b/package.json index 67bcab6..5056fa4 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,6 @@ "fondue" : "0.5.x" }, "engines" : { - "brackets" : ">=0.34.0" + "brackets" : ">=0.38.0" } } diff --git a/src/Preferences.js b/src/Preferences.js new file mode 100644 index 0000000..7d9b16b --- /dev/null +++ b/src/Preferences.js @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2014 Massachusetts Institute of Technology, Adobe Systems + * Incorporated, and other contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/*jslint vars: true, plusplus: true, devel: true, nomen: true, indent: 4, maxerr: 50 */ +/*global define, brackets, $ */ + +define(function (require, exports, module) { + "use strict"; + + var _ = brackets.getModule("thirdparty/lodash"), + PreferencesManager = brackets.getModule("preferences/PreferencesManager"), + prefs = PreferencesManager.getExtensionPrefs("theseus"), + stateManager = PreferencesManager.stateManager.getPrefixedSystem("theseus"); + + var preferences = { + prefs: { + // main.js + "enabled": { "type": "boolean", "value": true }, + "mode": { "type": "string", "value": "static" } + }, + states: { + // Usage.js + "usage.user_id": { "type": "string", "value": null }, + "usage.last_agreement_shown": { "type": "number", "value": -1 }, + "usage.usage_reporting_approved": { "type": "boolean", "value": false }, + "usage.research_contact_approved": { "type": "boolean", "value": false }, + "usage.research_contact_email": { "type": "string", "value": null }, + + // Update.js + "update.update_ignored": { "type": "boolean", "value": false }, + "update.last_ignored_version": { "type": "string", "value": null }, + "update.last_checked_at": { "type": "number", "value": 0 } + } + }; + + PreferencesManager.convertPreferences("com.adobe.theseus", { // main.js + "enabled": "user theseus.enabled", + "mode": "user theseus.mode" + }); + PreferencesManager.convertPreferences("com.adobe.theseus.usage-reporting", { // Usage.js + "user_id": "user theseus.usage.user_id", + "last_agreement_shown": "user theseus.usage.last_agreement_shown", + "usage_reporting_approved": "user theseus.usage.usage_reporting_approved", + "research_contact_approved": "user theseus.usage.research_contact_approved", + "research_contact_email": "user theseus.usage.research_contact_email" + }, true); + PreferencesManager.convertPreferences("com.adobe.theseus.update", { // Update.js + "update_ignored": "theseus.update.update_ignored", + "last_ignored_version": "theseus.update.last_ignored_version", + "last_checked_at": "theseus.update.last_checked_at" + }, true); + + _.each(preferences.prefs, function (definition, key) { + prefs.definePreference(key, definition.type, definition.value) + .on("change", function () { + $(exports).triggerHandler("change." + key); + }); + }); + _.each(preferences.states, function (definition, key) { + stateManager.definePreference(key, definition.type, definition.value); + }); + prefs.save(); + + function _getPrefLocation(key) { + return preferences.prefs[key] ? prefs : stateManager; + } + function set(key, value, save) { + var location = _getPrefLocation(key); + location.set(key, value); + if (save) { + location.save(); + } + } + function get(key) { + return _getPrefLocation(key).get(key); + } + + exports.set = set; + exports.get = get; +}); diff --git a/src/Update.js b/src/Update.js index ec84481..1e87313 100644 --- a/src/Update.js +++ b/src/Update.js @@ -31,17 +31,8 @@ define(function (require, exports, module) { var CommandManager = brackets.getModule("command/CommandManager"); var Dialogs = brackets.getModule("widgets/Dialogs"); var ExtensionManager = brackets.getModule("extensibility/ExtensionManager"); - var PreferencesManager = brackets.getModule("preferences/PreferencesManager"); var Strings = require("./strings"); - - var _prefs; - function _loadPreferences() { - _prefs = PreferencesManager.getPreferenceStorage("com.adobe.theseus.update", { - update_ignored: false, - last_ignored_version: 0, - last_checked_at: 0 - }); - } + var Preferences = require("./Preferences"); /** * @private @@ -107,8 +98,8 @@ define(function (require, exports, module) { if ($dialog.data("buttonId") === "upgrade") { _doUpdate(newVersion); } else { - _prefs.setValue("update_ignored", true); - _prefs.setValue("last_ignored_version", newVersion); + Preferences.set("update.update_ignored", true); + Preferences.set("update.last_ignored_version", newVersion, true); } }); } @@ -117,9 +108,7 @@ define(function (require, exports, module) { * Determines if a Theseus update is necessary and, if so, whether to show the dialog */ function updateIfNecessary() { - _loadPreferences(); - - var lastCheckedAt = _prefs.getValue("last_checked_at"); + var lastCheckedAt = Preferences.get("update.last_checked_at"); var now = new Date(); var MILLIS_IN_DAY = 86400000; if ((now - lastCheckedAt) < MILLIS_IN_DAY) { @@ -127,9 +116,9 @@ define(function (require, exports, module) { } _checkForUpdate().done(function (update) { - _prefs.setValue("last_checked_at", now.getTime()); + Preferences.set("update.last_checked_at", now.getTime(), true); if (update.hasUpdateAvailable) { - if (!_prefs.getValue("update_ignored") || _prefs.getValue("last_ignored_version") !== update.version) { + if (!Preferences.get("update.update_ignored") || Preferences.get("update.last_ignored_version") !== update.version) { showUpdateDialog(update.version, update.current); } } diff --git a/src/Usage.js b/src/Usage.js index bcef31a..af46ed3 100644 --- a/src/Usage.js +++ b/src/Usage.js @@ -35,8 +35,8 @@ define(function (require, exports, module) { var Main = require("../main"); var NodeAgent = require("./Agent-node"); var Panel = require("./Panel"); - var PreferencesManager = brackets.getModule("preferences/PreferencesManager") var UI = require("./UI"); + var Preferences = require("./Preferences"); var $exports = $(exports); @@ -51,22 +51,12 @@ define(function (require, exports, module) { var AGREEMENT_ID = 0; // increment every time the information we report changes - function _loadPreferences() { - _prefs = PreferencesManager.getPreferenceStorage("com.adobe.theseus.usage-reporting", { - user_id: _guid(), - last_agreement_shown: -1, - usage_reporting_approved: false, - research_contact_approved: false, - research_contact_email: undefined, - }); - } - function sawAgreement() { - return _prefs.getValue("last_agreement_shown") === AGREEMENT_ID; + return Preferences.get("usage.last_agreement_shown") === AGREEMENT_ID; } function _agreedToUsageReporting() { - return sawAgreement() && _prefs.getValue("usage_reporting_approved"); + return sawAgreement() && Preferences.get("usage.usage_reporting_approved"); } /** @@ -77,13 +67,14 @@ define(function (require, exports, module) { } **/ function recordAgreementResult(result) { - _prefs.setValue("last_agreement_shown", AGREEMENT_ID); - _prefs.setValue("usage_reporting_approved", result.usageOkay); - _prefs.setValue("research_contact_approved", result.contactOkay); + Preferences.set("usage.last_agreement_shown", AGREEMENT_ID); + Preferences.set("usage.usage_reporting_approved", result.usageOkay); + Preferences.set("usage.research_contact_approved", result.contactOkay); + console.log("Test"); if (result.email === undefined) { - _prefs.remove("research_contact_email", result.email); + Preferences.set("usage.research_contact_email", null, true); } else { - _prefs.setValue("research_contact_email", result.email); + Preferences.set("usage.research_contact_email", result.email, true); } if (result.usageOkay) { @@ -100,9 +91,9 @@ define(function (require, exports, module) { /** returns the last hash passed to recordAgreementResult **/ function lastAgreementResult() { return { - usageOkay: _prefs.getValue("usage_reporting_approved"), - contactOkay: _prefs.getValue("research_contact_approved"), - email: _prefs.getValue("research_contact_email"), + usageOkay: Preferences.get("usage.usage_reporting_approved"), + contactOkay: Preferences.get("usage.research_contact_approved"), + email: Preferences.get("usage.research_contact_email") }; } @@ -220,12 +211,16 @@ define(function (require, exports, module) { } function init() { - _loadPreferences(); + var userId = Preferences.get("usage.user_id"); + if (!userId) { + userId = _guid(); + Preferences.set("usage.user_id", userId, true); + } _registerProperties({ _theseusVersion: Main.version, _bracketsVersion: brackets.metadata.version, - _userId: _prefs.getValue("user_id"), + _userId: userId, _sessionId: _guid(), _platform: brackets.platform });