/*
* Copyright (c) 2015-2017, Michael A. Updike All rights reserved.
* Licensed under the BSD-3-Clause
* https://opensource.org/licenses/BSD-3-Clause
* https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md
*/
window.app = window.app || {};
/**
* Manage alarms from the chrome.alarms API
* @see https://developer.chrome.com/apps/alarms
* @namespace
*/
app.Alarm = (function() {
'use strict';
new ExceptionHandler();
const chromep = new ChromePromise();
/**
* Alarms triggered by chrome.alarms
* @typedef {Object} Alarms
* @property {string} ACTIVATE - screen saver is active
* @property {string} DEACTIVATE - screen saver is not activate
* @property {string} UPDATE_PHOTOS - photo sources should be updated
* @property {string} BADGE_TEXT - icon's Badge text should be set
* @const
* @private
* @memberOf app.Alarm
*/
const _ALARMS = {
'ACTIVATE': 'ACTIVATE',
'DEACTIVATE': 'DEACTIVATE',
'UPDATE_PHOTOS': 'UPDATE_PHOTOS',
'BADGE_TEXT': 'BADGE_TEXT',
};
/**
* Set state when the screensaver is in the active time range
* @private
* @memberOf app.Alarm
*/
function _setActiveState() {
if (Chrome.Storage.getBool('keepAwake')) {
chrome.power.requestKeepAwake('display');
}
const interval = app.Data.getIdleSeconds();
chromep.idle.queryState(interval).then((state) => {
// display screensaver if enabled and the idle time criteria is met
if (Chrome.Storage.getBool('enabled') && (state === 'idle')) {
app.SSControl.display(false);
}
return Promise.resolve();
}).catch((err) => {
Chrome.Log.error(err.message, 'Alarm._setActiveState');
});
app.Alarm.updateBadgeText();
}
/**
* Set state when the screensaver is in the inactive time range
* @private
* @memberOf app.Alarm
*/
function _setInactiveState() {
if (Chrome.Storage.getBool('allowSuspend')) {
chrome.power.releaseKeepAwake();
} else {
chrome.power.requestKeepAwake('system');
}
app.SSControl.close();
app.Alarm.updateBadgeText();
}
/**
* Set the Badge text on the icon
* @private
* @memberOf app.Alarm
*/
function _setBadgeText() {
let text = '';
if (Chrome.Storage.getBool('enabled')) {
text = app.Alarm.isActive() ? '' : Chrome.Locale.localize('sleep_abbrev');
} else {
text = Chrome.Storage.getBool('keepAwake') ? Chrome.Locale.localize(
'power_abbrev') : Chrome.Locale.localize('off_abbrev');
}
chrome.browserAction.setBadgeText({text: text});
}
/**
* Event: Fired when an alarm has elapsed.
* @see https://developer.chrome.com/apps/alarms#event-onAlarm
* @param {Object} alarm - details on alarm
* @private
* @memberOf app.Alarm
*/
function _onAlarm(alarm) {
switch (alarm.name) {
case _ALARMS.ACTIVATE:
// entering active time range of keep awake
_setActiveState();
break;
case _ALARMS.DEACTIVATE:
// leaving active time range of keep awake
_setInactiveState();
break;
case _ALARMS.UPDATE_PHOTOS:
// get the latest for the live photo streams
app.PhotoSources.processDaily();
break;
case _ALARMS.BADGE_TEXT:
// set the icons text
_setBadgeText();
break;
default:
break;
}
}
/**
* Event: called when document and resources are loaded
* @private
* @memberOf app.Alarm
*/
function _onLoad() {
// Listen for alarms
chrome.alarms.onAlarm.addListener(_onAlarm);
}
// listen for document and resources loaded
window.addEventListener('load', _onLoad);
return {
/**
* Set the repeating alarms states
* @memberOf app.Alarm
*/
updateRepeatingAlarms: function() {
const keepAwake = Chrome.Storage.getBool('keepAwake');
const aStart = Chrome.Storage.getBool('activeStart');
const aStop = Chrome.Storage.getBool('activeStop');
// create keep awake active period scheduling alarms
if (keepAwake && (aStart !== aStop)) {
const startDelayMin = Chrome.Time.getTimeDelta(aStart);
const stopDelayMin = Chrome.Time.getTimeDelta(aStop);
chrome.alarms.create(_ALARMS.ACTIVATE, {
delayInMinutes: startDelayMin,
periodInMinutes: Chrome.Time.MIN_IN_DAY,
});
chrome.alarms.create(_ALARMS.DEACTIVATE, {
delayInMinutes: stopDelayMin,
periodInMinutes: Chrome.Time.MIN_IN_DAY,
});
// if we are currently outside of the active range
// then set inactive state
if (!Chrome.Time.isInRange(aStart, aStop)) {
_setInactiveState();
}
} else {
chrome.alarms.clear(_ALARMS.ACTIVATE);
chrome.alarms.clear(_ALARMS.DEACTIVATE);
}
// Add daily alarm to update photo sources that request this
chromep.alarms.get(_ALARMS.UPDATE_PHOTOS).then((alarm) => {
if (!alarm) {
chrome.alarms.create(_ALARMS.UPDATE_PHOTOS, {
when: Date.now() + Chrome.Time.MSEC_IN_DAY,
periodInMinutes: Chrome.Time.MIN_IN_DAY,
});
}
return Promise.resolve();
}).catch((err) => {
Chrome.Log.error(err.message,
'chromep.alarms.get(_ALARMS.UPDATE_PHOTOS)');
});
},
/**
* Set the icon badge text
* @memberOf app.Alarm
*/
updateBadgeText: function() {
// delay setting a little to make sure range check is good
chrome.alarms.create(_ALARMS.BADGE_TEXT, {
when: Date.now() + 1000,
});
},
/**
* Determine if the screen saver can be displayed
* @returns {boolean} true, if can display
* @memberOf app.Alarm
*/
isActive: function() {
const enabled = Chrome.Storage.getBool('enabled');
const keepAwake = Chrome.Storage.getBool('keepAwake');
const aStart = Chrome.Storage.get('activeStart');
const aStop = Chrome.Storage.get('activeStop');
const inRange = Chrome.Time.isInRange(aStart, aStop);
// do not display if screen saver is not enabled or
// keepAwake scheduler is enabled and is in the inactive range
return !(!enabled || (keepAwake && !inRange));
},
};
})();