2020-08-16 20:24:45 +02:00
|
|
|
import { playbackManager } from '../components/playback/playbackmanager';
|
|
|
|
import { pluginManager } from '../components/pluginManager';
|
2022-03-31 16:18:45 -04:00
|
|
|
import inputManager from './inputManager';
|
|
|
|
import * as userSettings from './settings/userSettings';
|
2020-10-17 19:08:56 +01:00
|
|
|
import ServerConnections from '../components/ServerConnections';
|
2022-10-14 10:53:16 -04:00
|
|
|
import Events from '../utils/events.ts';
|
|
|
|
|
2021-01-26 15:43:40 -05:00
|
|
|
import './screensavermanager.scss';
|
2020-07-28 21:28:16 +01:00
|
|
|
|
|
|
|
function getMinIdleTime() {
|
|
|
|
// Returns the minimum amount of idle time required before the screen saver can be displayed
|
|
|
|
//time units used Millisecond
|
|
|
|
return 180000;
|
|
|
|
}
|
|
|
|
|
|
|
|
let lastFunctionalEvent = 0;
|
|
|
|
|
|
|
|
function getFunctionalEventIdleTime() {
|
|
|
|
return new Date().getTime() - lastFunctionalEvent;
|
|
|
|
}
|
|
|
|
|
2022-03-31 16:32:21 -04:00
|
|
|
Events.on(playbackManager, 'playbackstop', function (_e, stopInfo) {
|
2020-07-28 21:28:16 +01:00
|
|
|
const state = stopInfo.state;
|
|
|
|
if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') {
|
|
|
|
lastFunctionalEvent = new Date().getTime();
|
2019-11-23 23:00:44 +03:00
|
|
|
}
|
2020-07-28 21:28:16 +01:00
|
|
|
});
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
function getScreensaverPlugin(isLoggedIn) {
|
|
|
|
let option;
|
|
|
|
try {
|
|
|
|
option = userSettings.get('screensaver', false);
|
|
|
|
} catch (err) {
|
|
|
|
option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver';
|
2019-11-23 23:00:44 +03:00
|
|
|
}
|
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
const plugins = pluginManager.ofType('screensaver');
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-08-07 09:27:11 +01:00
|
|
|
for (const plugin of plugins) {
|
2020-07-28 21:28:16 +01:00
|
|
|
if (plugin.id === option) {
|
|
|
|
return plugin;
|
2019-11-27 18:02:38 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
return null;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
function ScreenSaverManager() {
|
|
|
|
let activeScreenSaver;
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
function showScreenSaver(screensaver) {
|
|
|
|
if (activeScreenSaver) {
|
|
|
|
throw new Error('An existing screensaver is already active.');
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
console.debug('Showing screensaver ' + screensaver.name);
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-10-31 22:39:30 +03:00
|
|
|
document.body.classList.add('screensaver-noScroll');
|
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
screensaver.show();
|
|
|
|
activeScreenSaver = screensaver;
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
if (screensaver.hideOnClick !== false) {
|
|
|
|
window.addEventListener('click', hide, true);
|
2019-11-23 23:00:44 +03:00
|
|
|
}
|
2020-07-28 21:28:16 +01:00
|
|
|
if (screensaver.hideOnMouse !== false) {
|
|
|
|
window.addEventListener('mousemove', hide, true);
|
2019-11-23 23:00:44 +03:00
|
|
|
}
|
2020-07-28 21:28:16 +01:00
|
|
|
if (screensaver.hideOnKey !== false) {
|
|
|
|
window.addEventListener('keydown', hide, true);
|
|
|
|
}
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
function hide() {
|
|
|
|
if (activeScreenSaver) {
|
|
|
|
console.debug('Hiding screensaver');
|
2020-10-31 22:39:30 +03:00
|
|
|
activeScreenSaver.hide().then(() => {
|
|
|
|
document.body.classList.remove('screensaver-noScroll');
|
|
|
|
});
|
2020-07-28 21:28:16 +01:00
|
|
|
activeScreenSaver = null;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
window.removeEventListener('click', hide, true);
|
|
|
|
window.removeEventListener('mousemove', hide, true);
|
|
|
|
window.removeEventListener('keydown', hide, true);
|
|
|
|
}
|
2019-11-27 20:39:45 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
this.isShowing = () => {
|
|
|
|
return activeScreenSaver != null;
|
|
|
|
};
|
2019-11-27 20:39:45 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
this.show = function () {
|
|
|
|
let isLoggedIn;
|
2020-10-17 19:08:56 +01:00
|
|
|
const apiClient = ServerConnections.currentApiClient();
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
if (apiClient && apiClient.isLoggedIn()) {
|
|
|
|
isLoggedIn = true;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
const screensaver = getScreensaverPlugin(isLoggedIn);
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
if (screensaver) {
|
|
|
|
showScreenSaver(screensaver);
|
|
|
|
}
|
|
|
|
};
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
this.hide = function () {
|
|
|
|
hide();
|
|
|
|
};
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
const onInterval = () => {
|
|
|
|
if (this.isShowing()) {
|
|
|
|
return;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
if (inputManager.idleTime() < getMinIdleTime()) {
|
|
|
|
return;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2022-09-16 00:50:54 -04:00
|
|
|
if (getFunctionalEventIdleTime() < getMinIdleTime()) {
|
2020-07-28 21:28:16 +01:00
|
|
|
return;
|
|
|
|
}
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
if (playbackManager.isPlayingVideo()) {
|
|
|
|
return;
|
2019-11-23 23:00:44 +03:00
|
|
|
}
|
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
this.show();
|
|
|
|
};
|
2019-11-23 23:00:44 +03:00
|
|
|
|
2020-07-28 21:28:16 +01:00
|
|
|
setInterval(onInterval, 10000);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default new ScreenSaverManager;
|