2020-04-07 00:14:06 +02:00
|
|
|
import playbackManager from 'playbackManager';
|
|
|
|
import focusManager from 'focusManager';
|
|
|
|
import appRouter from 'appRouter';
|
|
|
|
import dom from 'dom';
|
|
|
|
import appHost from 'apphost';
|
|
|
|
|
|
|
|
/* eslint-disable indent */
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
var lastInputTime = new Date().getTime();
|
2018-10-23 01:05:09 +03:00
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function notify() {
|
2019-01-10 15:39:37 +03:00
|
|
|
lastInputTime = new Date().getTime();
|
|
|
|
handleCommand('unknown');
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function notifyMouseMove() {
|
2019-01-10 15:39:37 +03:00
|
|
|
lastInputTime = new Date().getTime();
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function idleTime() {
|
2019-01-10 15:39:37 +03:00
|
|
|
return new Date().getTime() - lastInputTime;
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function select(sourceElement) {
|
2019-01-10 15:39:37 +03:00
|
|
|
sourceElement.click();
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +03:00
|
|
|
var eventListenerCount = 0;
|
2020-04-07 00:14:06 +02:00
|
|
|
export function on(scope, fn) {
|
2020-01-17 11:50:46 +03:00
|
|
|
eventListenerCount++;
|
2019-09-11 04:00:07 -07:00
|
|
|
dom.addEventListener(scope, 'command', fn, {});
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function off(scope, fn) {
|
2019-09-25 09:53:09 +09:00
|
|
|
if (eventListenerCount) {
|
|
|
|
eventListenerCount--;
|
|
|
|
}
|
2019-09-11 04:00:07 -07:00
|
|
|
dom.removeEventListener(scope, 'command', fn, {});
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +03:00
|
|
|
var commandTimes = {};
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
function checkCommandTime(command) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
var last = commandTimes[command] || 0;
|
|
|
|
var now = new Date().getTime();
|
|
|
|
|
|
|
|
if ((now - last) < 1000) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
commandTimes[command] = now;
|
|
|
|
return true;
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
export function handleCommand(commandName, options) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
lastInputTime = new Date().getTime();
|
|
|
|
|
|
|
|
var sourceElement = (options ? options.sourceElement : null);
|
|
|
|
|
|
|
|
if (sourceElement) {
|
|
|
|
sourceElement = focusManager.focusableParent(sourceElement);
|
|
|
|
}
|
|
|
|
|
2020-03-14 22:29:58 +03:00
|
|
|
if (!sourceElement) {
|
|
|
|
sourceElement = document.activeElement || window;
|
|
|
|
|
|
|
|
var dlg = document.querySelector('.dialogContainer .dialog.opened');
|
|
|
|
|
|
|
|
if (dlg && (!sourceElement || !dlg.contains(sourceElement))) {
|
|
|
|
sourceElement = dlg;
|
|
|
|
}
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
if (eventListenerCount) {
|
2018-10-23 01:05:09 +03:00
|
|
|
var customEvent = new CustomEvent("command", {
|
|
|
|
detail: {
|
2020-04-07 00:09:07 +02:00
|
|
|
command: commandName
|
2018-10-23 01:05:09 +03:00
|
|
|
},
|
2019-01-10 15:39:37 +03:00
|
|
|
bubbles: true,
|
|
|
|
cancelable: true
|
2018-10-23 01:05:09 +03:00
|
|
|
});
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
var eventResult = sourceElement.dispatchEvent(customEvent);
|
|
|
|
if (!eventResult) {
|
|
|
|
// event cancelled
|
|
|
|
return;
|
|
|
|
}
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2020-04-07 00:09:07 +02:00
|
|
|
const keyActions = (command) => ({
|
2020-04-07 19:11:53 +02:00
|
|
|
'up': () => {
|
|
|
|
focusManager.moveUp(sourceElement);
|
|
|
|
},
|
|
|
|
'down': () => {
|
|
|
|
focusManager.moveDown(sourceElement);
|
|
|
|
},
|
|
|
|
'left': () => {
|
|
|
|
focusManager.moveLeft(sourceElement);
|
|
|
|
},
|
|
|
|
'right': () => {
|
2020-04-07 19:49:22 +02:00
|
|
|
focusManager.moveRight(sourceElement);
|
2020-04-07 19:11:53 +02:00
|
|
|
},
|
|
|
|
'home': () => {
|
|
|
|
appRouter.goHome();
|
|
|
|
},
|
|
|
|
'settings': () => {
|
|
|
|
appRouter.showSettings();
|
|
|
|
},
|
2020-04-07 00:09:07 +02:00
|
|
|
'back': () => {
|
2020-01-21 12:51:33 +03:00
|
|
|
if (appRouter.canGoBack()) {
|
|
|
|
appRouter.back();
|
|
|
|
} else if (appHost.supports('exit')) {
|
|
|
|
appHost.exit();
|
|
|
|
}
|
2020-04-07 00:09:07 +02:00
|
|
|
},
|
2020-04-07 19:11:53 +02:00
|
|
|
'select': () => {
|
|
|
|
select(sourceElement);
|
|
|
|
},
|
|
|
|
'nextchapter': () => {
|
|
|
|
playbackManager.nextChapter();
|
|
|
|
},
|
|
|
|
'next': () => {
|
|
|
|
playbackManager.nextTrack();
|
|
|
|
},
|
|
|
|
'nexttrack': () => {
|
|
|
|
playbackManager.nextTrack();
|
|
|
|
},
|
|
|
|
'previous': () => {
|
|
|
|
playbackManager.previousTrack();
|
|
|
|
},
|
|
|
|
'previoustrack': () => {
|
|
|
|
playbackManager.previousTrack();
|
|
|
|
},
|
|
|
|
'previouschapter': () => {
|
|
|
|
playbackManager.previousChapter();
|
|
|
|
},
|
|
|
|
'guide': () => {
|
|
|
|
appRouter.showGuide();
|
|
|
|
},
|
|
|
|
'recordedtv': () => {
|
|
|
|
appRouter.showRecordedTV();
|
|
|
|
},
|
|
|
|
'livetv': () => {
|
|
|
|
appRouter.showLiveTV();
|
|
|
|
},
|
|
|
|
'mute': () => {
|
|
|
|
playbackManager.setMute(true);
|
|
|
|
},
|
|
|
|
'unmute': () => {
|
|
|
|
playbackManager.setMute(false);
|
|
|
|
},
|
|
|
|
'togglemute': () => {
|
|
|
|
playbackManager.toggleMute();
|
|
|
|
},
|
|
|
|
'channelup': () => {
|
|
|
|
playbackManager.channelUp();
|
|
|
|
},
|
|
|
|
'channeldown': () => {
|
|
|
|
playbackManager.channelDown();
|
|
|
|
},
|
|
|
|
'volumedown': () => {
|
|
|
|
playbackManager.volumeDown();
|
|
|
|
},
|
|
|
|
'volumeup': () => {
|
|
|
|
playbackManager.volumeUp();
|
|
|
|
},
|
|
|
|
'play': () => {
|
|
|
|
playbackManager.unpause();
|
|
|
|
},
|
|
|
|
'pause': () => {
|
|
|
|
playbackManager.pause();
|
|
|
|
},
|
|
|
|
'playpause': () => {
|
|
|
|
playbackManager.playPause();
|
|
|
|
},
|
2020-04-07 00:09:07 +02:00
|
|
|
'stop': () => {
|
2019-01-10 15:39:37 +03:00
|
|
|
if (checkCommandTime('stop')) {
|
|
|
|
playbackManager.stop();
|
|
|
|
}
|
2020-04-07 00:09:07 +02:00
|
|
|
},
|
2020-04-07 19:11:53 +02:00
|
|
|
'changezoom': () => {
|
|
|
|
playbackManager.toggleAspectRatio();
|
|
|
|
},
|
|
|
|
'changeaudiotrack': () => {
|
|
|
|
playbackManager.changeAudioStream();
|
|
|
|
},
|
|
|
|
'changesubtitletrack': () => {
|
|
|
|
playbackManager.changeSubtitleStream();
|
|
|
|
},
|
|
|
|
'search': () => {
|
|
|
|
appRouter.showSearch();
|
|
|
|
},
|
|
|
|
'favorites': () => {
|
|
|
|
appRouter.showFavorites();
|
|
|
|
},
|
|
|
|
'fastforward': () => {
|
|
|
|
playbackManager.fastForward();
|
|
|
|
},
|
|
|
|
'rewind': () => {
|
|
|
|
playbackManager.rewind();
|
|
|
|
},
|
|
|
|
'togglefullscreen': () => {
|
|
|
|
playbackManager.toggleFullscreen();
|
|
|
|
},
|
|
|
|
'disabledisplaymirror': () => {
|
|
|
|
playbackManager.enableDisplayMirroring(false);
|
|
|
|
},
|
|
|
|
'enabledisplaymirror': () => {
|
|
|
|
playbackManager.enableDisplayMirroring(true);
|
|
|
|
},
|
|
|
|
'toggledisplaymirror': () => {
|
|
|
|
playbackManager.toggleDisplayMirroring();
|
|
|
|
},
|
|
|
|
'nowplaying': () => {
|
|
|
|
appRouter.showNowPlaying();
|
|
|
|
},
|
|
|
|
'repeatnone': () => {
|
|
|
|
playbackManager.setRepeatMode('RepeatNone');
|
|
|
|
},
|
|
|
|
'repeatall': () => {
|
|
|
|
playbackManager.setRepeatMode('RepeatAll');
|
|
|
|
},
|
|
|
|
'repeatone': () => {
|
|
|
|
playbackManager.setRepeatMode('RepeatOne');
|
|
|
|
}
|
2020-04-07 00:09:07 +02:00
|
|
|
})[command];
|
|
|
|
|
2020-04-07 19:49:22 +02:00
|
|
|
try {
|
|
|
|
keyActions(commandName).call();
|
|
|
|
} catch (error) {
|
|
|
|
console.debug(`inputManager: tried to process command with no action assigned: ${commandName}`);
|
|
|
|
}
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
dom.addEventListener(document, 'click', notify, {
|
|
|
|
passive: true
|
|
|
|
});
|
|
|
|
|
2020-04-07 00:14:06 +02:00
|
|
|
/* eslint-enable indent */
|
|
|
|
|
|
|
|
export default {
|
|
|
|
trigger: handleCommand,
|
|
|
|
handle: handleCommand,
|
|
|
|
notify: notify,
|
|
|
|
notifyMouseMove: notifyMouseMove,
|
|
|
|
idleTime: idleTime,
|
|
|
|
on: on,
|
|
|
|
off: off
|
|
|
|
};
|