From 5ef535d88e00dd8d60c06cc6f5447f86997c1d35 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Fri, 5 Jan 2018 17:42:43 +0530 Subject: [PATCH] Electron-249 - Implemented a new feature that brings electron wrapper when a user receives a notification --- config/Symphony.config | 1 + .../Contents/MacOS/SymphonySettingsPlugin | Bin 68688 -> 69616 bytes .../Resources/Base.lproj/MyInstallerPane.nib | Bin 11948 -> 12728 bytes .../Contents/_CodeSignature/CodeResources | 6 +-- .../Base.lproj/MyInstallerPane.xib | 50 ++++++++++++------ .../SymphonySettingsPlugin/MyInstallerPane.h | 2 + .../SymphonySettingsPlugin/MyInstallerPane.m | 10 +++- installer/mac/postinstall.sh | 6 +++ installer/win/Symphony-x64.aip | 12 ++++- js/menus/menuTemplate.js | 17 +++++- js/notify/bringToFront.js | 28 ++++++++++ js/notify/electron-notify.js | 4 ++ js/notify/notifyImpl.js | 13 ++++- js/windowMgr.js | 1 + package.json | 2 +- 15 files changed, 127 insertions(+), 25 deletions(-) create mode 100644 js/notify/bringToFront.js diff --git a/config/Symphony.config b/config/Symphony.config index 92c88c90..fe86d00c 100644 --- a/config/Symphony.config +++ b/config/Symphony.config @@ -3,6 +3,7 @@ "minimizeOnClose" : true, "launchOnStartup" : true, "alwaysOnTop" : false, + "bringToFront": false, "whitelistUrl": "*", "notificationSettings": { "position": "upper-right", diff --git a/installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin b/installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin index bc7b725ad2d38b205fbb464dd952e1b8a43488c2..ce99eab5debee97884307749374561eba5de8fd4 100755 GIT binary patch delta 18023 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 tE3u3{n%ELe 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 diff --git a/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources b/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources index 97c3e45b..72bc26b7 100644 --- a/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources +++ b/installer/mac/SymphonySettingsPlugin.bundle/Contents/_CodeSignature/CodeResources @@ -6,7 +6,7 @@ Resources/Base.lproj/MyInstallerPane.nib - GZWN47BPj6b6mD6MnSVH/Qn0m3s= + qzPzEQIBkVBOKJZjQazFQhY6cL0= Resources/InstallerSections.plist @@ -37,11 +37,11 @@ hash - GZWN47BPj6b6mD6MnSVH/Qn0m3s= + qzPzEQIBkVBOKJZjQazFQhY6cL0= hash2 - cJ/kr1HEozYL0YeZriWDtnOL1NEd22vHzH5WGp1T3hk= + U8Qd70O1wfq0unofGkUAwq7LBjJi+Q/zxHWn1qlSpTY= Resources/InstallerSections.plist diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib index e40c4504..9a8e5f02 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/Base.lproj/MyInstallerPane.xib @@ -1,13 +1,14 @@ - + - + + @@ -18,6 +19,8 @@ + + @@ -39,7 +42,7 @@ - + @@ -48,7 +51,7 @@ - + @@ -57,21 +60,13 @@ - @@ -82,7 +77,7 @@ - + @@ -91,7 +86,7 @@ + diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h index 16de5579..acd6c83a 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.h @@ -14,5 +14,7 @@ @property (weak) IBOutlet NSTextField *podUrlTextBox; @property (weak) IBOutlet NSButton *alwaysOnTopCheckBox; @property (weak) IBOutlet NSTextField *podUrlAlertTextBox; +@property (weak) IBOutlet NSButton *bringToFrontCheckBox; +@property (weak) IBOutlet NSTextField *bringToFrontTextBox; @end diff --git a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m index 1ad998be..961d9262 100644 --- a/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m +++ b/installer/mac/SymphonySettingsPlugin/SymphonySettingsPlugin/MyInstallerPane.m @@ -63,16 +63,22 @@ minimizeOnClose = @"false"; } - // By default, set alwaysOnTop to false + // By default, set alwaysOnTop and bring to front to false NSString *alwaysOnTop = @"false\n"; + NSString *bringToFront = @"false\n"; // If the checkbox is changed, set the always on top value accordingly if ([_alwaysOnTopCheckBox state] == 1) { alwaysOnTop = @"true\n"; } + // If the checkbox is changed, set the bring to front value accordingly + if ([_bringToFrontCheckBox state] == 1) { + bringToFront = @"true\n"; + } + // Create an array with the selected options - NSArray *symSettings = [[NSArray alloc] initWithObjects:podUrl, minimizeOnClose, autoLaunchOnStart, alwaysOnTop, nil]; + NSArray *symSettings = [[NSArray alloc] initWithObjects:podUrl, minimizeOnClose, autoLaunchOnStart, alwaysOnTop, bringToFront, nil]; // Create a string from the array with new-line as the separator NSString *symSettingsString = [symSettings componentsJoinedByString:@"\n"]; diff --git a/installer/mac/postinstall.sh b/installer/mac/postinstall.sh index 3fab11a3..0faee3a3 100755 --- a/installer/mac/postinstall.sh +++ b/installer/mac/postinstall.sh @@ -11,6 +11,7 @@ pod_url=$(sed -n '1p' ${tempFilePath}); minimize_on_close=$(sed -n '2p' '/tmp/sym_settings.txt'); launch_on_startup=$(sed -n '3p' '/tmp/sym_settings.txt'); always_on_top=$(sed -n '4p' '/tmp/sym_settings.txt'); +bring_to_front=$(sed -n '5p' '/tmp/sym_settings.txt'); if [ "$pod_url" == "" ]; then pod_url="https://corporate.symphony.com" @@ -28,11 +29,16 @@ if [ "$always_on_top" == "" ]; then always_on_top=false; fi +if [ "$bring_to_front" == "" ]; then + bring_to_front=false; +fi + ## Replace the default settings with the user selected settings ## sed -i "" -E "s#\"url\" ?: ?\".*\"#\"url\"\: \"$pod_url\"#g" ${newPath} sed -i "" -E "s#\"minimizeOnClose\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"minimizeOnClose\":\ $minimize_on_close#g" ${newPath} sed -i "" -E "s#\"alwaysOnTop\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"alwaysOnTop\":\ $always_on_top#g" ${newPath} sed -i "" -E "s#\"launchOnStartup\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"launchOnStartup\":\ $launch_on_startup#g" ${newPath} +sed -i "" -E "s#\"bringToFront\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"bringToFront\":\ $bring_to_front#g" ${newPath} ## Remove the temp settings file created ## rm -f ${tempFilePath} diff --git a/installer/win/Symphony-x64.aip b/installer/win/Symphony-x64.aip index 7663bb00..8b8b53a7 100644 --- a/installer/win/Symphony-x64.aip +++ b/installer/win/Symphony-x64.aip @@ -20,6 +20,7 @@ + @@ -346,6 +347,7 @@ + @@ -388,6 +390,7 @@ + @@ -462,6 +465,8 @@ + + @@ -484,6 +489,8 @@ + + @@ -553,11 +560,11 @@ - + - + @@ -645,6 +652,7 @@ + diff --git a/js/menus/menuTemplate.js b/js/menus/menuTemplate.js index fda638df..ea8f970a 100644 --- a/js/menus/menuTemplate.js +++ b/js/menus/menuTemplate.js @@ -12,6 +12,7 @@ const aboutApp = require('../aboutApp'); let minimizeOnClose = false; let launchOnStartup = false; let isAlwaysOnTop = false; +let bringToFront = false; let symphonyAutoLauncher; @@ -254,6 +255,17 @@ function getTemplate(app) { } }); + // Window menu -> bringToFront + template[index].submenu.push({ + label: 'Bring to Front', + type: 'checkbox', + checked: bringToFront, + click: function(item) { + bringToFront = item.checked; + updateConfigField('bringToFront', bringToFront); + } + }); + if (!isMac) { template[index].submenu.push({ label: 'Quit Symphony', @@ -284,7 +296,7 @@ function setCheckboxValues() { /** * Method that reads multiple config fields */ - getMultipleConfigField(['minimizeOnClose', 'launchOnStartup', 'alwaysOnTop', 'notificationSettings']) + getMultipleConfigField(['minimizeOnClose', 'launchOnStartup', 'alwaysOnTop', 'notificationSettings', 'bringToFront']) .then(function (configData) { for (let key in configData) { if (configData.hasOwnProperty(key)) { // eslint-disable-line no-prototype-builtins @@ -302,6 +314,9 @@ function setCheckboxValues() { case 'notificationSettings': eventEmitter.emit('notificationSettings', configData[key]); break; + case 'bringToFront': + bringToFront = configData[key]; + break; default: break; } diff --git a/js/notify/bringToFront.js b/js/notify/bringToFront.js new file mode 100644 index 00000000..984b45b9 --- /dev/null +++ b/js/notify/bringToFront.js @@ -0,0 +1,28 @@ +'use strict'; + +const windowMgr = require('../windowMgr.js'); +const { getConfigField } = require('../config.js'); +const log = require('../log.js'); +const logLevels = require('../enums/logLevels.js'); + +/** + * Method that checks if user has enabled the bring to front feature + * if so then activates the main window + */ +function bringToFront() { + + getConfigField('bringToFront') + .then((bool) => { + if (bool) { + windowMgr.activate('main'); + } + }) + .catch((error) => { + log.send(logLevels.ERROR, 'Could not read bringToFront field from config error= ' + error); + }); +} + + +module.exports = { + bringToFront: bringToFront +}; \ No newline at end of file diff --git a/js/notify/electron-notify.js b/js/notify/electron-notify.js index 6bfb7cfb..439ba575 100644 --- a/js/notify/electron-notify.js +++ b/js/notify/electron-notify.js @@ -294,6 +294,10 @@ function setupConfig() { function notify(notification) { // Is it an object and only one argument? if (arguments.length === 1 && typeof notification === 'object') { + + if (typeof notification.onBringToFrontFunc === 'function') { + notification.onBringToFrontFunc({id: notification.id }); + } let notf = Object.assign({}, notification); // Use object instead of supplied parameters notf.id = latestID; diff --git a/js/notify/notifyImpl.js b/js/notify/notifyImpl.js index 285f447b..32218df3 100644 --- a/js/notify/notifyImpl.js +++ b/js/notify/notifyImpl.js @@ -2,6 +2,7 @@ const EventEmitter = require('events'); const { notify } = require('./electron-notify.js'); +const { bringToFront } = require('./bringToFront.js'); const log = require('../log.js'); const logLevels = require('../enums/logLevels.js'); /** @@ -45,7 +46,8 @@ class Notify { onShowFunc: onShow.bind(this), onClickFunc: onClick.bind(this), onCloseFunc: onClose.bind(this), - onErrorFunc: onError.bind(this) + onErrorFunc: onError.bind(this), + onBringToFrontFunc: onBringToFront.bind(this) }); log.send(logLevels.INFO, 'created notification, id=' + this._id + ', text=' + options.body); @@ -109,6 +111,15 @@ class Notify { this.destroy(); } } + + /** + * activates/focuses the main window + */ + function onBringToFront(arg) { + if (arg.id === this._id) { + bringToFront(); + } + } } /** diff --git a/js/windowMgr.js b/js/windowMgr.js index ff1e144a..9c8de54e 100644 --- a/js/windowMgr.js +++ b/js/windowMgr.js @@ -589,6 +589,7 @@ function activate(windowName) { if (window && !window.isDestroyed() && window.winName === windowName) { if (window.isMinimized()) { window.restore(); + window.focus(); } else { window.show(); } diff --git a/package.json b/package.json index f5f97751..02b6e643 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "demo-mac": "npm run prebuild && cross-env ELECTRON_DEV=true electron . --url=file://$(pwd)/demo/index.html", "search-win": "npm run prebuild && cross-env ELECTRON_DEV=true electron . --url=file:///demo/search.html", "search-mac": "npm run prebuild && cross-env ELECTRON_DEV=true electron . --url=file://$(pwd)/demo/search.html", - "unpacked-mac": "npm run prebuild && npm run test && build --mac --dir", + "unpacked-mac": "npm run prebuild && build --mac --dir", "packed-mac": "npm run unpacked-mac && packagesbuild -v installer/mac/symphony-mac-packager.pkgproj", "unpacked-win": "npm run prebuild && npm run test && build --win --x64 --dir", "unpacked-win-x86": "npm run prebuild && npm run test && build --win --ia32 --dir",