From a5f5556bd2fb9dab41b414f5c6334b4bba974237 Mon Sep 17 00:00:00 2001 From: Kiran Niranjan Date: Fri, 4 May 2018 16:08:09 +0530 Subject: [PATCH] Electron-445 - Verify user presence status before reloading the app --- js/enums/api.js | 3 ++- js/mainApiMgr.js | 7 ++++++- js/memoryMonitor.js | 44 +++++++++++++++++++++++++++++++++++---- js/preload/preloadMain.js | 15 +++++++++++++ 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/js/enums/api.js b/js/enums/api.js index b698bdb9..f2f2e3a4 100644 --- a/js/enums/api.js +++ b/js/enums/api.js @@ -20,7 +20,8 @@ const cmds = keyMirror({ bringToFront: null, openScreenPickerWindow: null, popupMenu: null, - optimizeMemoryConsumption: null + optimizeMemoryConsumption: null, + setPresenceStatus: null }); module.exports = { diff --git a/js/mainApiMgr.js b/js/mainApiMgr.js index e89edb2c..e85b8bdc 100644 --- a/js/mainApiMgr.js +++ b/js/mainApiMgr.js @@ -17,7 +17,7 @@ const { bringToFront } = require('./bringToFront.js'); const eventEmitter = require('./eventEmitter'); const { isMac } = require('./utils/misc'); const { openScreenPickerWindow } = require('./desktopCapturer'); -const { optimizeMemory } = require('./memoryMonitor'); +const { optimizeMemory, setPresenceStatus } = require('./memoryMonitor'); const apiEnums = require('./enums/api.js'); const apiCmds = apiEnums.cmds; @@ -153,6 +153,11 @@ electron.ipcMain.on(apiName, (event, arg) => { optimizeMemory(arg.memory); } break; + case apiCmds.setPresenceStatus: + if (typeof arg.status === 'string') { + setPresenceStatus(arg.status); + } + break; default: } diff --git a/js/memoryMonitor.js b/js/memoryMonitor.js index 26e6d861..9f929226 100644 --- a/js/memoryMonitor.js +++ b/js/memoryMonitor.js @@ -10,6 +10,7 @@ const maxMemory = 800; let maxIdleTime = 4 * 60 * 1000; let reloadThreshold = 30 * 60 * 1000; let reloadedTimeStamp; +let userPresenceStatus; // once a minute setInterval(gatherMemory, 1000 * 60); @@ -38,7 +39,7 @@ function optimizeMemory(memoryInfo) { const memoryConsumed = (memoryInfo && memoryInfo.workingSetSize / 1024) || 0; const canReload = (!reloadedTimeStamp || (new Date().getTime() - reloadedTimeStamp) > reloadThreshold); - if (memoryConsumed > maxMemory && systemIdleTime.getIdleTime() > maxIdleTime && canReload) { + if (memoryConsumed > maxMemory && systemIdleTime.getIdleTime() > maxIdleTime && canReload && !isUserActive()) { getConfigField('memoryRefresh') .then((enabled) => { if (enabled) { @@ -47,14 +48,49 @@ function optimizeMemory(memoryInfo) { if (mainWindow && !mainWindow.isDestroyed()) { setIsAutoReload(true); reloadedTimeStamp = new Date().getTime(); - log.send(logLevels.INFO, 'Reloading the app to optimize memory usage'); - mainWindow.webContents.reload(); + log.send(logLevels.INFO, 'Reloading the app to optimize memory usage as' + + ' memory consumption was ' + memoryConsumed + + ' user activity tick was ' + systemIdleTime.getIdleTime() + + ' user presence status was ' + userPresenceStatus ); + mainWindow.reload(); } } }); } } +/** + * Checks the user presence status to see + * if the user is active + * @return {boolean} + */ +function isUserActive() { + + if (!userPresenceStatus) { + return true + } + + switch (userPresenceStatus) { + case 'AVAILABLE': + case 'IN_A_MEETING': + case 'ON_THE_PHONE': + case 'OFFLINE': + return true; + default: + return false; + + } +} + +/** + * Sets the current user presence status + * @param status + */ +function setPresenceStatus(status) { + userPresenceStatus = status; +} + module.exports = { - optimizeMemory + optimizeMemory, + setPresenceStatus }; \ No newline at end of file diff --git a/js/preload/preloadMain.js b/js/preload/preloadMain.js index 54951950..3e836566 100644 --- a/js/preload/preloadMain.js +++ b/js/preload/preloadMain.js @@ -64,6 +64,13 @@ const throttledSetBadgeCount = throttle(1000, function(count) { }); }); +const throttledSetPresenceStatus = throttle(1000, function(status) { + local.ipcRenderer.send(apiName, { + cmd: apiCmds.setPresenceStatus, + status: status + }); +}); + // Gathers renderer process memory setInterval(() => { const memory = process.getProcessMemoryInfo(); @@ -286,6 +293,14 @@ function createAPI() { cmd: apiCmds.showNotificationSettings, windowName: windowName }); + }, + + /** + * Sets user presence status + * will be used to handle memory refresh functionality + */ + setPresenceStatus: function (status) { + throttledSetPresenceStatus(status); } };