Files
SysTray-X/webext/background.js

1088 lines
31 KiB
JavaScript
Raw Normal View History

2020-01-12 15:09:47 +01:00
var SysTrayX = {
2023-11-13 20:14:30 +01:00
Info: {},
Window: {},
Messaging: {},
mainWindowId: undefined,
windows: undefined,
2023-11-14 22:43:51 +01:00
startupType: undefined,
2020-04-21 21:38:44 +02:00
restorePositions: false,
startupWindowPositions: [],
2020-06-05 19:37:15 +02:00
hideDefaultIcon: false,
2023-08-25 18:18:20 +02:00
startApp: "",
startAppArgs: "",
newMessageDefaults: {}
2021-09-04 22:16:18 +02:00
};
2020-06-05 19:37:15 +02:00
2021-09-04 22:16:18 +02:00
SysTrayX.Info = {
version: "0",
platformInfo: {},
browserInfo: {},
2020-04-04 19:34:19 +02:00
2023-12-12 22:10:47 +01:00
options: {},
2021-09-04 22:16:18 +02:00
displayInfo: function () {
console.debug("Info Addon version: " + this.version);
console.debug("Info Platform: " + JSON.stringify(this.platformInfo));
console.debug("Info Browser: " + JSON.stringify(this.browserInfo));
},
2020-01-12 15:09:47 +01:00
};
2020-01-04 23:47:26 +01:00
SysTrayX.Messaging = {
2023-09-09 19:58:00 +02:00
startupDelayFinished: false,
2020-05-03 23:39:02 +02:00
accounts: [],
2022-06-19 22:01:58 +02:00
countType: "0",
2023-11-13 20:14:30 +01:00
showNewIndicator: "false",
2022-06-19 22:01:58 +02:00
closeType: "1",
2023-11-13 20:14:30 +01:00
apiCountMethod: "false",
filters: undefined,
2023-09-09 19:58:00 +02:00
newMailCache: [],
folderInfoChangeCache: [],
2021-08-08 21:52:33 +02:00
unread: {},
2022-06-16 23:11:59 +02:00
new: {},
displayedFolder: undefined,
2021-08-10 21:39:35 +02:00
init: async function () {
// Send the startup positions?
if (SysTrayX.restorePositions) {
SysTrayX.Link.postSysTrayXMessage({
positions: SysTrayX.startupWindowPositions,
});
2020-11-28 14:51:06 +01:00
}
2023-11-14 22:43:51 +01:00
// Minimize on startup handled by Companion app
if (SysTrayX.startupType === "1") {
SysTrayX.Link.postSysTrayXMessage({ startup: "minimized" });
}
if (SysTrayX.startupType === "2") {
SysTrayX.Link.postSysTrayXMessage({ startup: "docked" });
2020-12-31 16:43:02 +01:00
}
2020-04-03 17:45:20 +02:00
// Lookout for storage changes
browser.storage.onChanged.addListener(SysTrayX.Messaging.storageChanged);
2023-12-12 22:10:47 +01:00
// Request the options from app
SysTrayX.Messaging.requestOptions();
2020-06-14 23:20:29 +02:00
// Send the platform info to app
SysTrayX.Messaging.sendLocale();
2020-04-27 23:31:41 +02:00
// Send the platform info to app
SysTrayX.Messaging.sendPlatformInfo();
// Send the browser info to app
SysTrayX.Messaging.sendBrowserInfo();
2020-04-04 19:34:19 +02:00
// Send version to app
SysTrayX.Messaging.sendVersion();
2020-06-05 19:37:15 +02:00
// Send hide default icon preference
SysTrayX.Messaging.sendHideDefaultIcon();
// Send preferences to app
SysTrayX.Messaging.sendPreferences();
2023-08-25 18:18:20 +02:00
// Send start app trigger
SysTrayX.Messaging.sendStartApp();
2023-09-07 09:51:06 +02:00
// Let us wait until TB is ready, needed for TB91 (no accounts found, cannot create filters) and higher?
const startupDelay = await storage()
2021-09-05 17:04:13 +02:00
.get("startupDelay")
.then((result) => result.startupDelay || "5");
const delay = (ms) => new Promise((res) => setTimeout(res, ms));
2021-09-05 21:37:04 +02:00
await delay(startupDelay * 1000);
2023-09-09 19:58:00 +02:00
2023-10-16 22:09:00 +02:00
// Keep trace of account changes
if (SysTrayX.Info.browserInfo.majorVersion >= 98) {
browser.accounts.onCreated.addListener(SysTrayX.Messaging.accountAdded);
browser.accounts.onDeleted.addListener(SysTrayX.Messaging.accountDeleted);
}
2023-12-16 19:11:50 +01:00
// Get the accounts and subfolders
SysTrayX.Messaging.accounts = await browser.accounts.list();
2021-09-04 22:16:18 +02:00
2023-09-06 22:04:41 +02:00
console.debug("Accounts: " + JSON.stringify(SysTrayX.Messaging.accounts));
2021-09-04 22:16:18 +02:00
// Get the filters (needs the accounts)
const getFiltersPromise = () => new Promise((res) => res(getFilters()));
SysTrayX.Messaging.filters = await getFiltersPromise();
// Get the count type
const getCountTypePromise = () => new Promise((res) => res(getCountType()));
SysTrayX.Messaging.countType = await getCountTypePromise();
2023-11-13 20:14:30 +01:00
// Get the show new indicator
const getShowNewIndicatorPromise = () => new Promise((res) => res(getShowNewIndicator()));
SysTrayX.Messaging.showNewIndicator = await getShowNewIndicatorPromise();
2023-10-16 22:09:00 +02:00
// Check the filters for the accounts
SysTrayX.Messaging.accountFilterCheck();
2023-09-09 19:58:00 +02:00
// Handle cached mail changes on startup
SysTrayX.Messaging.startupDelayFinished = true;
2023-11-13 20:14:30 +01:00
if (SysTrayX.Info.browserInfo.majorVersion < 115 || SysTrayX.Messaging.apiCountMethod === "false" ) {
2023-09-11 21:31:07 +02:00
SysTrayX.Messaging.listenerNewMail();
}
2023-09-09 19:58:00 +02:00
SysTrayX.Messaging.listenerFolderInfoChanged();
2021-08-10 19:58:16 +02:00
2023-09-09 19:58:00 +02:00
// Catch folder changes
2023-09-06 22:04:41 +02:00
browser.folders.onCreated.addListener(
SysTrayX.Messaging.listenerFolderCreated
);
browser.folders.onRenamed.addListener(
SysTrayX.Messaging.listenerFolderRenamed
);
browser.folders.onDeleted.addListener(
SysTrayX.Messaging.listenerFolderDeleted
);
2021-08-10 21:39:35 +02:00
// Try to catch the window state
2020-02-24 23:00:45 +01:00
browser.windows.onFocusChanged.addListener(SysTrayX.Window.focusChanged);
2021-08-10 19:58:16 +02:00
},
2023-10-16 22:09:00 +02:00
accountAdded: function (id, account) {
//console.debug("accountAdded: Id: " + id);
//console.debug("accountAdded: Account: " + JSON.stringify(account));
},
accountDeleted: function (id) {
for (let i = 0; i < SysTrayX.Messaging.accounts.length; ++i) {
if (SysTrayX.Messaging.accounts[i].id === id) {
SysTrayX.Messaging.accounts.splice(i,1);
break;
}
}
SysTrayX.Messaging.accountFilterCheck();
},
accountFilterCheck: async function () {
let ids = [];
for (let i = 0; i < SysTrayX.Messaging.accounts.length; ++i) {
ids.push(SysTrayX.Messaging.accounts[i].id);
}
let newFilters = [];
let filtersChanged = false;
for (let i = 0; i < SysTrayX.Messaging.filters.length; ++i) {
const id = SysTrayX.Messaging.filters[i].accountId;
if (ids.includes(id)) {
newFilters.push(SysTrayX.Messaging.filters[i]);
} else {
2023-11-13 20:14:30 +01:00
if (SysTrayX.Info.browserInfo.majorVersion < 115 || SysTrayX.Messaging.apiCountMethod === "false") {
2023-10-16 22:09:00 +02:00
if (SysTrayX.Messaging.new[id] != undefined) {
delete SysTrayX.Messaging.new[id];
}
2023-11-13 20:14:30 +01:00
if (SysTrayX.Messaging.unread[id] !== undefined) {
2023-10-16 22:09:00 +02:00
delete SysTrayX.Messaging.unread[id];
}
}
filtersChanged = true;
}
}
//console.debug("checkFilters: Old: " + JSON.stringify(SysTrayX.Messaging.filters));
//console.debug("checkFilters: New: " + JSON.stringify(newFilters));
//console.debug("checkFilters: MesNew: " + JSON.stringify(SysTrayX.Messaging.new));
//console.debug("checkFilters: MesUnread: " + JSON.stringify(SysTrayX.Messaging.unread));
if (filtersChanged) {
SysTrayX.Messaging.filters = [...newFilters];
await storage().set({
filters: SysTrayX.Messaging.filters,
});
}
},
2022-06-16 23:11:59 +02:00
listenerNewMail: function (folder, messages) {
2023-09-09 19:58:00 +02:00
// Cache the new mail
if (folder)
{
SysTrayX.Messaging.newMailCache.push({ folder, messages });
}
2024-07-28 21:27:59 +02:00
//console.debug("listenerNewMail: New mail in: " + JSON.stringify(folder));
//console.debug("listenerNewMail: New messages: " + JSON.stringify(messages));
//console.debug("listenerNewMail: Cache: " + SysTrayX.Messaging.newMailCache.length );
2023-09-09 19:58:00 +02:00
if (SysTrayX.Messaging.startupDelayFinished)
{
// Process the received messages
SysTrayX.Messaging.newMailCache.forEach( (mail) =>
{
if (mail.messages.messages.length > 0) {
if (SysTrayX.Messaging.new[mail.folder.accountId] === undefined) {
SysTrayX.Messaging.new[mail.folder.accountId] = {};
}
2023-09-06 21:21:06 +02:00
2023-09-09 19:58:00 +02:00
if (SysTrayX.Messaging.new[mail.folder.accountId][mail.folder.path] === undefined) {
SysTrayX.Messaging.new[mail.folder.accountId][mail.folder.path] = [];
}
2023-09-06 21:21:06 +02:00
2023-09-09 19:58:00 +02:00
SysTrayX.Messaging.new[mail.folder.accountId][mail.folder.path] =
SysTrayX.Messaging.new[mail.folder.accountId][mail.folder.path].concat(
mail.messages.messages
);
}
});
2022-06-16 23:11:59 +02:00
2024-07-28 21:27:59 +02:00
//console.debug("listenerNewMail: new: " + JSON.stringify(SysTrayX.Messaging.new));
2023-09-09 19:58:00 +02:00
// Cache handled
SysTrayX.Messaging.newMailCache = [];
}
},
2022-06-16 23:11:59 +02:00
2023-09-09 19:58:00 +02:00
listenerFolderInfoChanged: async function (folder, folderInfo) {
2024-07-14 15:09:39 +02:00
2024-07-28 21:27:59 +02:00
//console.debug("listenerFolderInfoChanged: folder: " + JSON.stringify(folder));
//console.debug("listenerFolderInfoChanged: folderinfo: " + JSON.stringify(folderInfo));
//console.debug("listenerFolderInfoChanged: Cache: " + SysTrayX.Messaging.folderInfoChangeCache.length );
2024-07-14 15:09:39 +02:00
2024-07-28 21:27:59 +02:00
if (SysTrayX.Messaging.startupDelayFinished) {
if (SysTrayX.Info.browserInfo.majorVersion < 115 || SysTrayX.Messaging.apiCountMethod === "false") {
sendMailCountPre115();
2024-07-18 15:23:50 +02:00
} else {
2023-11-13 20:14:30 +01:00
sendMailCount();
2024-07-28 21:27:59 +02:00
}
2023-09-09 19:58:00 +02:00
}
2022-06-16 23:11:59 +02:00
},
2024-07-28 21:27:59 +02:00
2021-08-10 19:58:16 +02:00
listenerFolderCreated: function (createdFolder) {
2021-08-10 20:13:33 +02:00
const found = isParentFolderInFilters(createdFolder);
2021-08-10 19:58:16 +02:00
if (found) {
addFolderToFilters(createdFolder);
}
2021-08-08 17:34:42 +02:00
},
2021-08-10 19:58:16 +02:00
listenerFolderRenamed: function (originalFolder, renameFolder) {
2021-08-10 20:13:33 +02:00
deleteFolderFromFilters(originalFolder);
const found = isParentFolderInFilters(renameFolder);
if (found) {
addFolderToFilters(renameFolder);
}
2021-08-10 19:58:16 +02:00
},
listenerFolderDeleted: function (deletedFolder) {
2021-08-10 20:13:33 +02:00
deleteFolderFromFilters(deletedFolder);
2021-08-10 19:58:16 +02:00
},
2023-12-10 16:52:04 +01:00
showHideForceCloseButton: function () {
2023-11-13 20:14:30 +01:00
if (SysTrayX.Messaging.closeType === "2" || SysTrayX.Messaging.closeType === "4") {
// Activate the extra close button when all to tray/taskbar is selected
browser.browserAction.setTitle({title: "Force close"});
browser.browserAction.setIcon({path: "icons/close.svg"});
browser.browserAction.enable();
} else {
browser.browserAction.setTitle({title: " "});
browser.browserAction.setIcon({path: "icons/dummy.png"});
browser.browserAction.disable();
}
2023-12-10 16:52:04 +01:00
},
onNewWindow: async function (id) {
SysTrayX.Messaging.showHideForceCloseButton();
2022-07-08 14:25:55 +02:00
2023-11-13 20:14:30 +01:00
SysTrayX.Link.postSysTrayXMessage({ newWindow: id });
},
onCloseButton: async function (id, quit) {
let state = undefined;
if (SysTrayX.Messaging.closeType === "1" || SysTrayX.Messaging.closeType === "2") {
// Minimize to tray
state = "docked";
} else if (SysTrayX.Messaging.closeType === "3" || SysTrayX.Messaging.closeType === "4") {
// Minimize
state = "minimized";
}
if (state !== undefined) {
// Send new state to the companion
SysTrayX.Link.postSysTrayXMessage({ closeWindow: { id: id, quit: quit } });
}
2020-05-05 16:44:37 +02:00
},
//
// Handle a storage change
//
2021-09-04 22:16:18 +02:00
storageChanged: async function (changes, area) {
// Get the new preferences
if ("filters" in changes && changes["filters"].newValue) {
SysTrayX.Messaging.filters = changes["filters"].newValue;
2020-05-12 21:38:03 +02:00
2023-09-11 21:31:07 +02:00
sendMailCountPre115();
sendMailCount();
2020-04-03 17:45:20 +02:00
}
if ("newMessageDefaults" in changes && changes["newMessageDefaults"].newValue) {
SysTrayX.newMessageDefaults = JSON.parse(changes["newMessageDefaults"].newValue);
}
2020-08-09 20:22:19 +02:00
if ("closeType" in changes && changes["closeType"].newValue) {
SysTrayX.Messaging.closeType = changes["closeType"].newValue;
2023-12-10 16:52:04 +01:00
await browser.windowEvent.setCloseType(Number(SysTrayX.Messaging.closeType));
2020-05-10 20:55:27 +02:00
2023-12-10 16:52:04 +01:00
browser.windowEvent.onNewWindow.removeListener(
SysTrayX.Messaging.onNewWindow
);
2023-11-13 20:14:30 +01:00
browser.windowEvent.onCloseButtonClick.removeListener(
SysTrayX.Messaging.onCloseButton
);
2020-08-09 20:22:19 +02:00
if (SysTrayX.Messaging.closeType !== "0") {
2023-12-10 16:52:04 +01:00
browser.windowEvent.onNewWindow.addListener(
SysTrayX.Messaging.onNewWindow
);
2020-05-10 20:55:27 +02:00
browser.windowEvent.onCloseButtonClick.addListener(
SysTrayX.Messaging.onCloseButton
);
}
2023-12-10 16:52:04 +01:00
SysTrayX.Messaging.showHideForceCloseButton();
2020-05-10 20:55:27 +02:00
}
if ("countType" in changes && changes["countType"].newValue) {
SysTrayX.Messaging.countType = changes["countType"].newValue;
2023-09-11 21:31:07 +02:00
sendMailCountPre115();
sendMailCount();
2020-04-03 17:45:20 +02:00
}
2023-11-13 20:14:30 +01:00
if ("showNewIndicator" in changes && changes["showNewIndicator"].newValue) {
SysTrayX.Messaging.showNewIndicator = changes["showNewIndicator"].newValue;
sendMailCountPre115();
sendMailCount();
}
if ("addonprefchanged" in changes && changes["addonprefchanged"].newValue) {
//
// Send new preferences to the app
//
SysTrayX.Messaging.sendPreferences();
// Reset flag
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-04 19:34:19 +02:00
addonprefchanged: false,
});
}
},
2023-12-12 22:10:47 +01:00
requestOptions: function () {
SysTrayX.Link.postSysTrayXMessage({ optionsRequest: true });
},
2020-04-27 23:31:41 +02:00
sendBrowserInfo: function () {
2021-09-04 22:16:18 +02:00
const info = SysTrayX.Info.browserInfo;
2020-05-02 14:49:05 +02:00
SysTrayX.Link.postSysTrayXMessage({ browserInfo: info });
2020-04-27 23:31:41 +02:00
},
sendPlatformInfo: function () {
2021-09-04 22:16:18 +02:00
const info = SysTrayX.Info.platformInfo;
2020-05-02 14:49:05 +02:00
SysTrayX.Link.postSysTrayXMessage({ platformInfo: info });
2020-04-27 23:31:41 +02:00
},
2020-04-04 19:34:19 +02:00
sendVersion: function () {
2021-09-04 22:16:18 +02:00
SysTrayX.Link.postSysTrayXMessage({ version: SysTrayX.Info.version });
2020-04-04 19:34:19 +02:00
},
2020-06-05 19:37:15 +02:00
sendHideDefaultIcon: function () {
SysTrayX.Link.postSysTrayXMessage({
hideDefaultIcon: SysTrayX.hideDefaultIcon,
});
},
2020-06-14 23:20:29 +02:00
sendLocale: function () {
const locale = browser.i18n.getUILanguage();
SysTrayX.Link.postSysTrayXMessage({
locale: locale,
});
},
2023-08-25 18:18:20 +02:00
sendStartApp: function () {
SysTrayX.Link.postSysTrayXMessage({
2023-08-25 18:18:20 +02:00
startApp: SysTrayX.startApp,
startAppArgs: SysTrayX.startAppArgs,
});
},
sendCloseApp: function () {
SysTrayX.Link.postSysTrayXMessage({
closeApp: "closeApp",
});
},
2021-09-04 22:16:18 +02:00
sendPreferences: async function () {
await storage()
2021-09-04 22:16:18 +02:00
.get([
"debug",
"minimizeType",
"minimizeIconType",
2021-09-04 22:16:18 +02:00
"closeType",
2023-11-14 22:43:51 +01:00
"startupType",
2024-04-15 22:00:54 +02:00
"windowPosCor",
"windowPosCorType",
2021-09-04 22:16:18 +02:00
"restorePositions",
"defaultIconType",
"defaultIconMime",
"defaultIcon",
"hideDefaultIcon",
"iconType",
"iconMime",
"icon",
2023-10-24 22:42:56 +02:00
"invertIcon",
2021-09-04 22:16:18 +02:00
"showNumber",
2023-08-27 21:01:48 +02:00
"showNewIndicator",
2023-08-29 19:41:21 +02:00
"countType",
"startupDelay",
2023-11-13 20:14:30 +01:00
"apiCountMethod",
2021-09-04 22:16:18 +02:00
"numberColor",
"numberSize",
"numberAlignment",
"numberMargins",
2023-08-29 19:41:21 +02:00
"newIndicatorType",
"newShadeColor",
2023-08-25 18:18:20 +02:00
"startApp",
"startAppArgs",
"closeApp",
"closeAppArgs",
2023-12-04 23:12:03 +01:00
"showHideShortcut",
2024-08-17 14:40:45 +02:00
"newMessageFroms",
"newMessageDefaults",
2021-09-04 22:16:18 +02:00
])
.then(
SysTrayX.Messaging.sendPreferencesStorage,
SysTrayX.Messaging.onSendPreferecesStorageError
);
},
2020-01-12 15:09:47 +01:00
2020-04-04 19:34:19 +02:00
sendPreferencesStorage: function (result) {
2020-01-23 23:28:52 +01:00
const debug = result.debug || "false";
2021-01-03 22:01:20 +01:00
const minimizeType = result.minimizeType || "1";
const minimizeIconType = result.minimizeIconType || "1";
2020-08-02 16:59:53 +02:00
const closeType = result.closeType || "1";
2023-11-15 13:03:21 +01:00
const startupType = result.startupType || "0";
2024-04-15 22:00:54 +02:00
const windowPosCor = result.windowPosCor || "false";
const windowPosCorType = result.windowPosCorType || "0";
2020-12-20 13:05:27 +01:00
const restorePositions = result.restorePositions || "false";
2020-05-22 22:54:10 +02:00
const defaultIconType = result.defaultIconType || "0";
const defaultIconMime = result.defaultIconMime || "image/png";
const defaultIcon = result.defaultIcon || [];
2020-06-04 17:58:27 +02:00
const hideDefaultIcon = result.hideDefaultIcon || "false";
2020-01-23 23:28:52 +01:00
const iconType = result.iconType || "0";
const iconMime = result.iconMime || "image/png";
const icon = result.icon || [];
2023-10-24 22:42:56 +02:00
const invertIcon = result.invertIcon || "false";
2020-04-05 14:39:19 +02:00
const showNumber = result.showNumber || "true";
2023-08-29 21:13:42 +02:00
const showNewIndicator = result.showNewIndicator || "false";
2023-08-29 19:41:21 +02:00
const countType = result.countType || "0";
const startupDelay = result.startupDelay || "5";
2023-11-13 20:14:30 +01:00
const apiCountMethod = result.apiCountMethod || "false";
2020-12-06 00:36:31 +01:00
let numberColor = result.numberColor || "#000000";
2020-06-13 21:31:28 +02:00
const numberSize = result.numberSize || "10";
2020-12-11 20:57:30 +01:00
const numberAlignment = result.numberAlignment || "4";
const numberMargins = result.numberMargins || {
left: 0,
top: 0,
right: 0,
bottom: 0,
};
2023-08-29 19:41:21 +02:00
const newIndicatorType = result.newIndicatorType || "2";
const newShadeColor = result.newShadeColor || "#ff8000";
2023-08-25 18:18:20 +02:00
const startApp = result.startApp || "";
const startAppArgs = result.startAppArgs || "";
const closeApp = result.closeApp || "";
const closeAppArgs = result.closeAppArgs || "";
2023-12-04 23:12:03 +01:00
const showHideShortcut = result.showHideShortcut || "";
2024-08-17 14:40:45 +02:00
const newMessageFroms = result.newMessageFroms || [];
const newMessageDefaults = result.newMessageDefaults || "";
2020-12-06 00:36:31 +01:00
// Send it to the app
SysTrayX.Link.postSysTrayXMessage({
preferences: {
debug,
minimizeType,
minimizeIconType,
closeType,
2023-11-14 22:43:51 +01:00
startupType,
2024-04-15 22:00:54 +02:00
windowPosCor,
windowPosCorType,
restorePositions,
defaultIconType,
defaultIconMime,
defaultIcon,
hideDefaultIcon,
iconType,
iconMime,
icon,
2023-10-24 22:42:56 +02:00
invertIcon,
showNumber,
2023-08-27 21:01:48 +02:00
showNewIndicator,
2023-08-29 19:41:21 +02:00
countType,
startupDelay,
2023-11-13 20:14:30 +01:00
apiCountMethod,
numberColor,
numberSize,
numberAlignment,
numberMargins,
2023-08-29 19:41:21 +02:00
newIndicatorType,
newShadeColor,
2023-08-25 18:18:20 +02:00
startApp,
startAppArgs,
closeApp,
closeAppArgs,
2023-12-04 23:12:03 +01:00
showHideShortcut,
2024-08-17 14:40:45 +02:00
newMessageFroms,
newMessageDefaults,
2020-04-04 19:34:19 +02:00
},
});
},
2020-04-04 19:34:19 +02:00
onSendIconStorageError: function (error) {
console.log(`GetIcon Error: ${error}`);
},
2020-04-04 19:34:19 +02:00
onGetAccountsStorageError: function (error) {
console.log(`GetAccounts Error: ${error}`);
2020-04-04 19:34:19 +02:00
},
2020-01-12 15:09:47 +01:00
};
2020-01-13 23:22:11 +01:00
//
// Link object. Handles the native messaging to the system tray app
2020-01-13 23:22:11 +01:00
//
SysTrayX.Link = {
portSysTrayX: undefined,
2020-04-04 19:34:19 +02:00
init: function () {
// Connect to the app
2020-01-13 23:22:11 +01:00
this.portSysTrayX = browser.runtime.connectNative("SysTray_X");
// Listen for messages from the app.
this.portSysTrayX.onMessage.addListener(
SysTrayX.Link.receiveSysTrayXMessage
);
},
2020-04-04 19:34:19 +02:00
postSysTrayXMessage: function (object) {
// Send object (will be stringified by postMessage)
2022-07-03 14:16:05 +02:00
2023-10-03 21:46:28 +02:00
//console.debug("postSysTrayXMessage: " + JSON.stringify(object));
SysTrayX.Link.portSysTrayX.postMessage(object);
2020-01-13 23:22:11 +01:00
},
2021-09-04 22:16:18 +02:00
receiveSysTrayXMessage: async function (response) {
2024-08-17 14:40:45 +02:00
2020-02-29 19:04:43 +01:00
if (response["shutdown"]) {
2023-12-10 16:52:04 +01:00
browser.windowEvent.onNewWindow.removeListener(
SysTrayX.Messaging.onNewWindow
);
2020-05-10 20:55:27 +02:00
browser.windowEvent.onCloseButtonClick.removeListener(
SysTrayX.Messaging.onCloseButton
);
SysTrayX.Link.postSysTrayXMessage({ shutdown: "true" });
2020-02-29 19:04:43 +01:00
}
2024-08-17 14:40:45 +02:00
const newMessage = response["newMessage"];
if (newMessage !== undefined) {
if (newMessage === "")
{
var tab = await browser.compose.beginNew();
} else {
const newMessageDefaults = SysTrayX.newMessageDefaults[newMessage] ?? undefined;
let details = {};
if (newMessageDefaults !== undefined)
{
if (SysTrayX.Info.browserInfo.majorVersion < 102) {
details = {
from: newMessage,
// attachPublicPGPKey: newMessageDefaults.pgpKey, //TB128 no error, working?
bcc: newMessageDefaults.bcc.split(";"),
body: newMessageDefaults.body,
cc: newMessageDefaults.cc.split(";"),
replyTo: newMessageDefaults.replyTo.split(";"),
subject: newMessageDefaults.subject,
to: newMessageDefaults.to.split(";"),
}
} else {
details = {
from: newMessage,
// attachPublicPGPKey: newMessageDefaults.pgpKey, //TB128 no error, working?
// attachVCard: newMessageDefaults.vCard, // Not working
bcc: newMessageDefaults.bcc.split(";"),
body: newMessageDefaults.body,
cc: newMessageDefaults.cc.split(";"),
deliveryStatusNotification: newMessageDefaults.statNot,
replyTo: newMessageDefaults.replyTo.split(";"),
returnReceipt: newMessageDefaults.retRec,
subject: newMessageDefaults.subject,
to: newMessageDefaults.to.split(";"),
}
}
} else {
details = {
from: newMessage
}
2024-08-17 14:40:45 +02:00
}
2024-08-17 14:40:45 +02:00
var tab = await browser.compose.beginNew(undefined,details);
}
}
2023-12-12 22:10:47 +01:00
const options = response["options"];
if (options !== undefined) {
SysTrayX.Info.options = options;
2021-09-04 22:16:18 +02:00
await storage().set({
2023-12-12 22:10:47 +01:00
options: options,
2020-06-07 16:19:39 +02:00
});
}
const positions = response["positions"];
if (positions) {
2021-09-04 22:16:18 +02:00
await storage().set({
windowPositions: positions,
});
}
if (response["preferences"]) {
// Store the preferences from the app
2023-08-29 19:41:21 +02:00
const minimizeType = response["preferences"].minimizeType;
if (minimizeType) {
await storage().set({
minimizeType: minimizeType,
});
}
const minimizeIconType = response["preferences"].minimizeIconType;
if (minimizeIconType) {
await storage().set({
minimizeIconType: minimizeIconType,
});
}
const closeType = response["preferences"].closeType;
if (closeType) {
await storage().set({
closeType: closeType,
});
}
2023-11-14 22:43:51 +01:00
const startupType = response["preferences"].startupType;
if (startupType) {
2023-08-29 19:41:21 +02:00
await storage().set({
2023-11-14 22:43:51 +01:00
startupType: startupType,
2023-08-29 19:41:21 +02:00
});
}
2024-04-15 22:00:54 +02:00
const windowPosCor = response["preferences"].windowPosCor;
if (windowPosCor) {
await storage().set({
windowPosCor: windowPosCor,
});
}
const windowPosCorType = response["preferences"].windowPosCorType;
if (windowPosCorType) {
await storage().set({
windowPosCorType: windowPosCorType,
});
}
2023-08-29 19:41:21 +02:00
const restorePositions = response["preferences"].restorePositions;
if (restorePositions) {
await storage().set({
restorePositions: restorePositions,
});
}
2020-05-22 22:54:10 +02:00
const defaultIconMime = response["preferences"].defaultIconMime;
if (defaultIconMime) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-05-22 22:54:10 +02:00
defaultIconMime: defaultIconMime,
});
}
const defaultIcon = response["preferences"].defaultIcon;
if (defaultIcon) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-05-22 22:54:10 +02:00
defaultIcon: defaultIcon,
});
}
const defaultIconType = response["preferences"].defaultIconType;
if (defaultIconType) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-05-22 22:54:10 +02:00
defaultIconType: defaultIconType,
});
}
2020-06-03 22:46:46 +02:00
const hideDefaultIcon = response["preferences"].hideDefaultIcon;
if (hideDefaultIcon) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-06-03 22:46:46 +02:00
hideDefaultIcon: hideDefaultIcon,
});
}
2020-01-23 23:28:52 +01:00
const iconMime = response["preferences"].iconMime;
if (iconMime) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-04 19:34:19 +02:00
iconMime: iconMime,
});
}
2020-01-23 23:28:52 +01:00
const icon = response["preferences"].icon;
if (icon) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-04 19:34:19 +02:00
icon: icon,
});
}
2020-01-23 23:28:52 +01:00
const iconType = response["preferences"].iconType;
if (iconType) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-04 19:34:19 +02:00
iconType: iconType,
});
}
2023-10-24 22:42:56 +02:00
const invertIcon = response["preferences"].invertIcon;
if (invertIcon) {
2023-08-29 19:41:21 +02:00
await storage().set({
2023-10-24 22:42:56 +02:00
invertIcon: invertIcon,
2023-08-29 19:41:21 +02:00
});
}
2020-04-05 14:39:19 +02:00
const showNumber = response["preferences"].showNumber;
if (showNumber) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-05 14:39:19 +02:00
showNumber: showNumber,
});
}
2023-08-27 21:01:48 +02:00
const showNewIndicator = response["preferences"].showNewIndicator;
if (showNewIndicator) {
await storage().set({
showNewIndicator: showNewIndicator,
});
}
const countType = response["preferences"].countType;
if (countType) {
2021-09-04 22:16:18 +02:00
await storage().set({
countType: countType,
});
}
2021-09-05 17:04:13 +02:00
const startupDelay = response["preferences"].startupDelay;
if (startupDelay) {
await storage().set({
startupDelay: startupDelay,
});
}
2023-11-13 20:14:30 +01:00
const apiCountMethod = response["preferences"].apiCountMethod;
if (apiCountMethod !== undefined) {
await storage().set({
apiCountMethod: apiCountMethod,
});
SysTrayX.Messaging.apiCountMethod = apiCountMethod;
}
2023-08-29 19:41:21 +02:00
const numberColor = response["preferences"].numberColor;
if (numberColor) {
2021-09-04 22:16:18 +02:00
await storage().set({
2023-08-29 19:41:21 +02:00
numberColor: numberColor,
2020-04-07 17:19:02 +02:00
});
}
2023-08-29 19:41:21 +02:00
const numberSize = response["preferences"].numberSize;
if (numberSize) {
await storage().set({
2023-08-29 19:41:21 +02:00
numberSize: numberSize,
});
}
2023-08-29 19:41:21 +02:00
const numberAlignment = response["preferences"].numberAlignment;
if (numberAlignment) {
2021-09-04 22:16:18 +02:00
await storage().set({
2023-08-29 19:41:21 +02:00
numberAlignment: numberAlignment,
2020-06-28 23:23:12 +02:00
});
}
2023-08-29 19:41:21 +02:00
const numberMargins = response["preferences"].numberMargins;
if (numberMargins) {
2021-09-04 22:16:18 +02:00
await storage().set({
2023-08-29 19:41:21 +02:00
numberMargins: numberMargins,
2020-02-18 00:24:31 +01:00
});
}
2023-08-29 19:41:21 +02:00
const newIndicatorType = response["preferences"].newIndicatorType;
if (newIndicatorType) {
2021-09-04 22:16:18 +02:00
await storage().set({
2023-08-29 19:41:21 +02:00
newIndicatorType: newIndicatorType,
2020-12-20 13:05:27 +01:00
});
}
2023-08-29 19:41:21 +02:00
const newShadeColor = response["preferences"].newShadeColor;
if (newShadeColor) {
2021-09-04 22:16:18 +02:00
await storage().set({
2023-08-29 19:41:21 +02:00
newShadeColor: newShadeColor,
2020-12-06 00:36:31 +01:00
});
}
2023-08-25 18:18:20 +02:00
const startApp = response["preferences"].startApp;
if (startApp !== undefined) {
await storage().set({
2023-08-25 18:18:20 +02:00
startApp: startApp,
});
}
2023-08-25 18:18:20 +02:00
const startAppArgs = response["preferences"].startAppArgs;
if (startAppArgs !== undefined) {
await storage().set({
2023-08-25 18:18:20 +02:00
startAppArgs: startAppArgs,
});
}
const closeApp = response["preferences"]. closeApp;
if (closeApp !== undefined) {
await storage().set({
closeApp: closeApp,
});
}
const closeAppArgs = response["preferences"].closeAppArgs;
if (closeAppArgs !== undefined) {
await storage().set({
closeAppArgs: closeAppArgs,
});
}
2023-12-04 23:12:03 +01:00
const showHideShortcut = response["preferences"].showHideShortcut;
if (showHideShortcut !== undefined) {
await storage().set({
showHideShortcut: showHideShortcut,
});
}
2020-01-23 23:28:52 +01:00
const debug = response["preferences"].debug;
if (debug) {
2021-09-04 22:16:18 +02:00
await storage().set({
2020-04-04 19:34:19 +02:00
debug: debug,
});
}
}
2020-04-04 19:34:19 +02:00
},
2020-01-13 23:22:11 +01:00
};
SysTrayX.Window = {
2023-11-14 22:43:51 +01:00
focusChanged: async function (windowId) {
2023-11-13 20:14:30 +01:00
2023-11-14 22:43:51 +01:00
const windows_all = await browser.windows.getAll();
//console.debug("focusChanged windows: " + JSON.stringify(windows_all));
2023-11-13 20:14:30 +01:00
2023-11-14 22:43:51 +01:00
const windows = windows_all.map( (win) => { return {id: win.id, state: win.state} });
//console.debug("focusChanged windows: " + JSON.stringify(windows));
SysTrayX.Link.postSysTrayXMessage({ windows: windows } );
2020-04-04 19:34:19 +02:00
},
2022-06-19 22:01:58 +02:00
folderChanged: function (tab, displayedFolder) {
2023-09-11 21:31:07 +02:00
2023-10-03 21:46:28 +02:00
//console.debug("Folder changed tab: " + JSON.stringify(tab));
//console.debug("Folder changed displayedFolder: " + JSON.stringify(displayedFolder));
2022-07-03 17:43:34 +02:00
2023-11-13 20:14:30 +01:00
if (SysTrayX.Info.browserInfo.majorVersion < 115 || SysTrayX.Messaging.apiCountMethod === "false") {
2023-09-11 21:31:07 +02:00
const oldDisplayedFolder = SysTrayX.Messaging.displayedFolder;
if (oldDisplayedFolder !== undefined) {
if (
SysTrayX.Messaging.new[oldDisplayedFolder.accountId] !== undefined &&
SysTrayX.Messaging.new[oldDisplayedFolder.accountId][
oldDisplayedFolder.path
] !== undefined
) {
SysTrayX.Messaging.new[oldDisplayedFolder.accountId][
oldDisplayedFolder.path
] = [];
}
2023-09-11 21:31:07 +02:00
if (SysTrayX.Messaging.startupDelayFinished) {
sendMailCountPre115();
}
}
SysTrayX.Messaging.displayedFolder = displayedFolder;
} else {
if (SysTrayX.Messaging.startupDelayFinished) {
sendMailCount();
}
}
2022-06-19 22:01:58 +02:00
},
};
2020-01-24 22:20:30 +01:00
async function start() {
2023-11-13 20:14:30 +01:00
// Setup the link first
SysTrayX.Link.init();
2023-12-04 23:12:03 +01:00
2023-11-13 20:14:30 +01:00
// Force close a window using a toolbar button
browser.browserAction.disable();
browser.browserAction.onClicked.addListener(async () => {
const window = await browser.windows.getCurrent();
2023-12-10 16:52:04 +01:00
await browser.windowEvent.forceClose(window.id);
2023-11-13 20:14:30 +01:00
// Send new state to the companion
SysTrayX.Link.postSysTrayXMessage({ closeWindow: { id: window.id, quit: true } });
});
2021-09-05 21:37:04 +02:00
// Set platform
SysTrayX.Info.platformInfo = await browser.runtime
.getPlatformInfo()
.then((info) => info);
// Set browser
SysTrayX.Info.browserInfo = await browser.runtime
.getBrowserInfo()
.then((info) => info);
const version = SysTrayX.Info.browserInfo.version.split(".");
SysTrayX.Info.browserInfo.majorVersion = version[0];
SysTrayX.Info.browserInfo.minorVersion = version[1];
// Get addon version
SysTrayX.Info.version = browser.runtime.getManifest().version;
SysTrayX.Info.displayInfo();
2023-11-13 20:14:30 +01:00
// Get the API count method preference
const apiCountMethod = await getApiCountMethod();
SysTrayX.Messaging.apiCountMethod = apiCountMethod;
2023-10-13 22:44:25 +02:00
// Try to catch the mails
2023-11-13 20:14:30 +01:00
if (SysTrayX.Info.browserInfo.majorVersion < 115 || SysTrayX.Messaging.apiCountMethod === "false") {
2023-10-13 22:44:25 +02:00
// Catch the new incomming mail
browser.messages.onNewMailReceived.addListener(
SysTrayX.Messaging.listenerNewMail
);
}
// Set catch folder changes
browser.folders.onFolderInfoChanged.addListener(
SysTrayX.Messaging.listenerFolderInfoChanged
);
2023-09-11 21:31:07 +02:00
// Catch a folder change to reset the new counter
browser.mailTabs.onDisplayedFolderChanged.addListener(
SysTrayX.Window.folderChanged
);
2023-11-14 22:43:51 +01:00
// Get the prefered startup type
const startupType = await getStartupType();
SysTrayX.startupType = startupType;
2020-04-21 21:38:44 +02:00
// Restore window positions
const restorePositions = await getRestorePositionsState();
2021-09-04 22:16:18 +02:00
if (restorePositions === "true") {
SysTrayX.restorePositions = true;
// Get the start window positions
SysTrayX.startupWindowPositions = await getStartupWindowPositions();
}
2023-11-13 20:14:30 +01:00
// Get main window id
const window = await browser.windows.getCurrent();
SysTrayX.mainWindowId = window.id;
//console.debug("Main window ID: " + SysTrayX.mainWindowId);
// Get all windows
const windows = await browser.windows.getAll();
SysTrayX.windows = windows;
//console.debug("All window IDs: " + JSON.stringify(windows.map((win) => win.id)));
//console.debug("Window: " + JSON.stringify(windows));
2023-12-10 16:52:04 +01:00
// Set the main window id
await browser.windowEvent.setMainWindowId(Number(SysTrayX.mainWindowId));
2023-11-13 20:14:30 +01:00
// Set the close type
2020-08-02 21:32:09 +02:00
SysTrayX.Messaging.closeType = await getCloseType();
2023-12-10 16:52:04 +01:00
await browser.windowEvent.setCloseType(Number(SysTrayX.Messaging.closeType));
2023-11-13 20:14:30 +01:00
2020-05-10 20:55:27 +02:00
// Intercept close button?
2020-08-09 20:22:19 +02:00
if (SysTrayX.Messaging.closeType !== "0") {
2023-11-13 20:14:30 +01:00
browser.windowEvent.onNewWindow.addListener(
SysTrayX.Messaging.onNewWindow
);
2020-05-10 20:55:27 +02:00
browser.windowEvent.onCloseButtonClick.addListener(
SysTrayX.Messaging.onCloseButton
);
2023-12-10 16:52:04 +01:00
SysTrayX.Messaging.showHideForceCloseButton();
2020-05-10 20:55:27 +02:00
}
2020-06-05 19:37:15 +02:00
// Hide the default icon
const hideDefaultIcon = await getHideDefaultIcon();
SysTrayX.hideDefaultIcon = hideDefaultIcon;
2023-08-25 20:44:32 +02:00
// Get start app launch parameters
2023-08-25 18:18:20 +02:00
const {startApp, startAppArgs} = await getStartAppParam();
SysTrayX.startApp = startApp;
SysTrayX.startAppArgs = startAppArgs;
// Get new message defaults
const newMessageDefaults = await getNewMessageDefaults();
SysTrayX.newMessageDefaults = newMessageDefaults;
2021-09-04 22:16:18 +02:00
// Used sync storage
// const inUse = await browser.storage.sync.getBytesInUse();
// console.log("Storage in use: " + inUse);
2020-04-04 16:51:13 +02:00
2020-02-29 19:04:43 +01:00
// Init defaults before everything
2020-08-29 20:18:40 +02:00
2023-12-12 22:10:47 +01:00
// Reset the options
await storage().set({
options: {
kdeIntegration: true,
shortcuts: true,
},
});
2021-09-04 22:16:18 +02:00
// Reset KDE integration
await storage().set({
kdeIntegration: true,
});
// Get the default icons
const getDefaultIconPromise = () =>
new Promise((res) => res(getDefaultIcon()));
await getDefaultIconPromise();
const getIconPromise = () => new Promise((res) => res(getIcon()));
await getIconPromise();
2020-01-24 22:20:30 +01:00
// Main start
SysTrayX.Messaging.init();
}
console.log("Starting SysTray-X");
2020-01-04 23:47:26 +01:00
2020-01-24 22:20:30 +01:00
// Start the add-on
start();