diff --git a/data/actions.js b/data/actions.js index 1d413f3..6784b63 100644 --- a/data/actions.js +++ b/data/actions.js @@ -9,6 +9,14 @@ function emptyEm() { browser.folder_actions.emptyTrashFolders(); browser.folder_actions.emptyJunkFolders(); console.log("Empty-em: Emptying.. Done"); + + // TODO: Do this on done event + browser.notifications.create("emptyem-done-notify", { + "type": "basic", + "iconUrl": browser.extension.getURL("icons/icon.png"), + "title": "Empty 'em done!", + "message": "Cleaned Trash and Junk folders" + }); } // Handlers diff --git a/data/common.js b/data/common.js new file mode 100644 index 0000000..109cc52 --- /dev/null +++ b/data/common.js @@ -0,0 +1,72 @@ +// ----------------------------------------------- +// Common functions used in Options handling +// ----------------------------------------------- +// +// Get default values of preferences +// +function getPrefDefaults() { + return { + prefs: { + overrideDeleteConfirm: false, + selectTrashDelete: false, + selectJunkDelete: false, + consoleDebug: false, + disableDoneNotification: false, + alsoCompact: false + } + }; +} + +// +// Get preferences from storage and return the structure asynchronously +// +async function getPrefs() { + let getting = await browser.storage.sync.get("prefs"); + + let fr = ""; + if ($.isEmptyObject(getting)) { + prefs = getPrefDefaults(); + fr = "defaults"; + } else { + prefs = getting; + fr = "storage"; + }; + console.log("Loaded prefs from " + fr); + + return getting; +} + +// +// Handle the event of an option change in options UI. Event is passed in as +// the 'ch' argument. This function records the changed option in to the +// options storage and returns the updated structure asynchronously +// +async function changeOption(ch) { + var i = ch[0].id; + var c = ch[0].checked; + console.log("Pref: " + i + " -> " + c); + if (i == "overrideDeleteConfirm") { prefs.prefs.overrideDeleteConfirm = c; } + else if (i == "selectTrashDelete") { prefs.prefs.selectTrashDelete = c; } + else if (i == "selectJunkDelete") { prefs.prefs.selectJunkDelete = c; } + else if (i == "consoleDebug") { prefs.prefs.consoleDebug = c; } + else if (i == "disableDoneNotification") { prefs.prefs.disableDoneNotification = c; } + else if (i == "alsoCompact") { prefs.prefs.alsoCompact = c; } + await browser.storage.sync.set(prefs); + + prefs = await getPrefs(); + + return prefs; +} + +// +// Given the preferences structure, update the options IO with appropriate values +// +function updateOptionsForm(prefs) { + $("#overrideDeleteConfirm").prop('checked', prefs.prefs.overrideDeleteConfirm); + $("#selectTrashDelete").prop('checked', prefs.prefs.selectTrashDelete); + $("#selectJunkDelete").prop('checked', prefs.prefs.selectJunkDelete); + $("#selectJunkDelete").prop('checked', prefs.prefs.selectJunkDelete); + $("#consoleDebug").prop('checked', prefs.prefs.consoleDebug); + $("#disableDoneNotification").prop('checked', prefs.prefs.disableDoneNotification); + $("#alsoCompact").prop('checked', prefs.prefs.alsoCompact); +} diff --git a/data/options.html b/data/options.html index 9dbbe70..6fe1c82 100644 --- a/data/options.html +++ b/data/options.html @@ -120,6 +120,7 @@ body { + diff --git a/data/options.js b/data/options.js index 5a8329a..e93732d 100644 --- a/data/options.js +++ b/data/options.js @@ -1,3 +1,19 @@ // ----------------------------------------------- // Options UI and handling // ----------------------------------------------- +// +// Load preferences from options storage. When done, update the options UI with +// values. Then, set up the listener for option changes. +// +async function loadOptions() { + let prefs = await getPrefs(); + updateOptionsForm(prefs); + + $("input[type=checkbox]").change(function() { + changeOption($(this)); + }); +} + +$(function() { + loadOptions(); +}); diff --git a/folder_actions-api/api.js b/folder_actions-api/api.js index f98a082..35334f6 100644 --- a/folder_actions-api/api.js +++ b/folder_actions-api/api.js @@ -11,6 +11,10 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { super(); this.extension = extension; + this.options = { + consoleDebug: 0, + alsoCompact: 0 + }; } get type() { @@ -56,11 +60,11 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { this.factory = factory.QueryInterface(Ci.nsIFactory); registrar.registerFactory( - this.classID, `Cloud file provider for ${this.extension.id}`, contractID, this.factory + this.classID, `Folder Actions provider for ${this.extension.id}`, contractID, this.factory ); XPCOMUtils.categoryManager.addCategoryEntry( - "cloud-files", this.extension.id, contractID, false, true + "folder-actions", this.extension.id, contractID, false, true ); } @@ -68,7 +72,7 @@ class FolderActionsProvider extends ExtensionCommon.EventEmitter { let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); registrar.unregisterFactory(this.classID, this.factory); - XPCOMUtils.categoryManager.deleteCategoryEntry("cloud-files", this.extension.id, false); + XPCOMUtils.categoryManager.deleteCategoryEntry("folder-actions", this.extension.id, false); } } @@ -91,10 +95,18 @@ this.folder_actions = class extends ExtensionAPI { } } + debugMsg(msg) { + if (this.provider.options.consoleDebug > 0) { + console.log(msg); + } + } + getFolderInfo() { let data = []; + let self = this; - toArray(fixIterator(MailServices.accounts.accounts,Components.interfaces.nsIMsgAccount)).map(function(account) { + toArray(fixIterator(MailServices.accounts.accounts,Components.interfaces.nsIMsgAccount)). + map(function(account) { let info = { server: null, type: null, @@ -107,13 +119,13 @@ this.folder_actions = class extends ExtensionAPI { let find_flagged_folders = function(folder,inf) { if (folder.getFlag(Ci.nsMsgFolderFlags.Trash)) { - console.log("Folder: " + folder.URI + " has Trash flag "); + self.debugMsg("Folder: " + folder.URI + " has Trash flag "); inf.trashFolder = folder; - console.log(folder); + self.debugMsg(folder); } else if (folder.getFlag(Ci.nsMsgFolderFlags.Junk)) { - console.log("Folder: " + folder.URI + " has Junk flag "); + self.debugMsg("Folder: " + folder.URI + " has Junk flag "); inf.junkFolder = folder; - console.log(folder); + self.debugMsg(folder); } else { if (folder.hasSubFolders) { toArray(fixIterator(folder.subFolders, Ci.nsMsgFolder)).map(function (f) { @@ -135,7 +147,7 @@ this.folder_actions = class extends ExtensionAPI { }); data.push(info); }); - console.log(data); + this.debugMsg(data); return data; } @@ -147,29 +159,32 @@ this.folder_actions = class extends ExtensionAPI { return { folder_actions: { + emptyFolder: function(folderName) { let finfo = self.getFolderInfo(); }, + emptyTrashFolders: function() { let finfo = self.getFolderInfo(); finfo.map(function(info) { if (info.trashFolder) { - console.log("emptyTrashFolders: Considering " + info.trashFolder.URI); - console.log("emptyTrashFolders: canDeleteMessages? " + info.trashFolder.canDeleteMessages); - console.log("emptyTrashFolders: hasSubFolders? " + info.trashFolder.hasSubFolders); - console.log(info.trashFolder); + self.debugMsg("emptyTrashFolders: Considering " + info.trashFolder.URI); + self.debugMsg("emptyTrashFolders: canDeleteMessages? " + info.trashFolder.canDeleteMessages); + self.debugMsg("emptyTrashFolders: hasSubFolders? " + info.trashFolder.hasSubFolders); + self.debugMsg(info.trashFolder); info.trashFolder.emptyTrash(null,null); } }); }, + emptyJunkFolders: function() { let finfo = self.getFolderInfo(); finfo.map(function(info) { if (info.junkFolder) { - console.log("emptyTrashFolders: Considering " + info.junkFolder.URI); - console.log("emptyTrashFolders: canDeleteMessages? " + info.junkFolder.canDeleteMessages); - console.log("emptyTrashFolders: hasSubFolders? " + info.junkFolder.hasSubFolders); - console.log(info.junkFolder); + self.debugMsg("emptyTrashFolders: Considering " + info.junkFolder.URI); + self.debugMsg("emptyTrashFolders: canDeleteMessages? " + info.junkFolder.canDeleteMessages); + self.debugMsg("emptyTrashFolders: hasSubFolders? " + info.junkFolder.hasSubFolders); + self.debugMsg(info.junkFolder); var junk_msgs = Cc["@mozilla.org/array;1"] .createInstance(Ci.nsIMutableArray); var enumerator = info.junkFolder.messages; @@ -183,6 +198,10 @@ this.folder_actions = class extends ExtensionAPI { } } }); + }, + + setOptions: function(options) { + self.provider.options = Object.assign(self.provider.options, options); } } }; diff --git a/folder_actions-api/schema.json b/folder_actions-api/schema.json index fcf42a2..72f9dfe 100644 --- a/folder_actions-api/schema.json +++ b/folder_actions-api/schema.json @@ -21,16 +21,16 @@ "namespace": "folder_actions", "events": [ { - "name": "onEmptyFolder", + "name": "onEmptyTrash", "type": "function", - "description": "Fired when a folder is emptied", - "parameters": [ - { - "name": "folderName", - "$ref": "MailFolder", - "description": "The folder to be emptied" - } - ] + "description": "Fired when Trash folders are emptied", + "parameters": [] + }, + { + "name": "onEmptyJunk", + "type": "function", + "description": "Fired when Junk folders are emptied", + "parameters": [] } ], "types": [ @@ -44,18 +44,37 @@ "description": "Name of the folder to be emptied" } } + }, + { + "id": "ApiOptions", + "type": "object", + "description": "Folder API options", + "properties": { + "consoleDebug": { + "type": "integer", + "minimum": 0, + "optional": true, + "description": "If set to 1, debug messages are printed out in console log" + }, + "alsoCompact": { + "type": "integer", + "minimum": 0, + "optional": true, + "description": "If set to 1, also compact folder after emptying" + } + } } ], "functions": [ { - "name": "emptyFolder", + "name": "setOptions", "type": "function", - "description": "Empties specified mail folder", + "description": "Sets options for this API", "parameters": [ { - "name": "folderName", - "$ref": "MailFolder", - "description": "The mail folder to empty" + "name": "options", + "$ref": "ApiOptions", + "description": "API Options object" } ] }, diff --git a/manifest.json b/manifest.json index 440c810..3648ad7 100644 --- a/manifest.json +++ b/manifest.json @@ -16,6 +16,8 @@ } }, + "permissions": ["storage", "notifications"], + "browser_action": { "default_icon": { "16": "icons/icon.png", @@ -24,10 +26,6 @@ "default_title": "Empty 'em" }, - // "folder_actions": { - // "name": "EmptyEm" - // }, - "options_ui": { "page": "data/options.html" },