diff --git a/receivers/common/web/main/Renderer.ts b/receivers/common/web/main/Renderer.ts index 938f3b6..61b4954 100644 --- a/receivers/common/web/main/Renderer.ts +++ b/receivers/common/web/main/Renderer.ts @@ -203,7 +203,7 @@ function renderQRCode(url: string) { onQRCodeRendered(); } -document.addEventListener('keydown', (event: KeyboardEvent) => { +export function keyDownEventHandler(event: KeyboardEvent) { // logger.info("KeyDown", event); let result = targetKeyDownEventListener(event); let handledCase = result.handledCase; @@ -221,8 +221,9 @@ document.addEventListener('keydown', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyDown.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyDown, key, event.repeat, handledCase))); } -}); -document.addEventListener('keyup', (event: KeyboardEvent) => { +} + +export function keyUpEventHandler(event: KeyboardEvent) { // logger.info("KeyUp", event); let result = targetKeyUpEventListener(event); let handledCase = result.handledCase; @@ -240,4 +241,7 @@ document.addEventListener('keyup', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyUp.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyUp, key, event.repeat, handledCase))); } -}); +} + +document.addEventListener('keydown', keyDownEventHandler); +document.addEventListener('keyup', keyUpEventHandler); diff --git a/receivers/common/web/player/Renderer.ts b/receivers/common/web/player/Renderer.ts index 630401e..edf6a0f 100644 --- a/receivers/common/web/player/Renderer.ts +++ b/receivers/common/web/player/Renderer.ts @@ -923,7 +923,7 @@ function skipForward() { } } -document.addEventListener('keydown', (event: KeyboardEvent) => { +function keyDownEventHandler(event: KeyboardEvent) { // logger.info("KeyDown", event.key); let result = targetKeyDownEventListener(event); let handledCase = result.handledCase; @@ -993,8 +993,9 @@ document.addEventListener('keydown', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyDown.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyDown, key, event.repeat, handledCase))); } -}); -document.addEventListener('keyup', (event: KeyboardEvent) => { +} + +function keyUpEventHandler(event: KeyboardEvent) { // logger.info("KeyUp", event); let result = targetKeyUpEventListener(event); let handledCase = result.handledCase; @@ -1012,7 +1013,10 @@ document.addEventListener('keyup', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyUp.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyUp, key, event.repeat, handledCase))); } -}); +} + +document.addEventListener('keydown', keyDownEventHandler); +document.addEventListener('keyup', keyUpEventHandler); export { PlayerControlEvent, @@ -1042,4 +1046,6 @@ export { formatDuration, skipBack, skipForward, + keyDownEventHandler, + keyUpEventHandler, }; diff --git a/receivers/common/web/viewer/Renderer.ts b/receivers/common/web/viewer/Renderer.ts index a8b7785..0477ac7 100644 --- a/receivers/common/web/viewer/Renderer.ts +++ b/receivers/common/web/viewer/Renderer.ts @@ -329,7 +329,7 @@ document.onmousemove = () => { uiHideTimer.start(); }; -document.addEventListener('keydown', (event: KeyboardEvent) => { +function keyDownEventHandler(event: KeyboardEvent) { // logger.info("KeyDown", event); let result = targetKeyDownEventListener(event); let handledCase = result.handledCase; @@ -379,8 +379,9 @@ document.addEventListener('keydown', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyDown.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyDown, key, event.repeat, handledCase))); } -}); -document.addEventListener('keyup', (event: KeyboardEvent) => { +} + +function keyUpEventHandler(event: KeyboardEvent) { // logger.info("KeyUp", event); let result = targetKeyUpEventListener(event); let handledCase = result.handledCase; @@ -398,7 +399,10 @@ document.addEventListener('keyup', (event: KeyboardEvent) => { if (window.targetAPI.getSubscribedKeys().keyUp.has(key)) { window.targetAPI.sendEvent(new EventMessage(Date.now(), new KeyEvent(EventType.KeyUp, key, event.repeat, handledCase))); } -}); +} + +document.addEventListener('keydown', keyDownEventHandler); +document.addEventListener('keyup', keyUpEventHandler); export { PlayerControlEvent, @@ -411,4 +415,6 @@ export { onPlayPlaylist, playerCtrlStateUpdate, setPlaylistItem, + keyDownEventHandler, + keyUpEventHandler, }; diff --git a/receivers/webos/fcast-receiver/src/Main.ts b/receivers/webos/fcast-receiver/src/Main.ts index a93624b..e1bfea0 100644 --- a/receivers/webos/fcast-receiver/src/Main.ts +++ b/receivers/webos/fcast-receiver/src/Main.ts @@ -1,5 +1,7 @@ import { Logger, LoggerType } from 'common/Logger'; import { ServiceManager } from 'lib/common'; +require('lib/webOSTVjs-1.2.10/webOSTV.js'); +require('lib/webOSTVjs-1.2.10/webOSTV-dev.js'); declare global { interface Window { @@ -10,6 +12,8 @@ declare global { const logger = new Logger('Main', LoggerType.FRONTEND); const webPage: HTMLIFrameElement = document.getElementById('page') as HTMLIFrameElement; let launchHandlerCallback = () => { logger.warn('No (re)launch handler set'); }; +let keyDownEventHandler = () => { logger.warn('No keyDown event handler set'); }; +let keyUpEventHandler = () => { logger.warn('No keyUp event handler set'); }; function loadPage(path: string) { // @ts-ignore @@ -20,13 +24,35 @@ function loadPage(path: string) { // so bugs related to oversubscribing/canceling services are worked around by only subscribing once to // required services logger.info('Starting webOS application') +window.webOS.deviceInfo((info) => { logger.info('Device info:', info); }); window.webOSApp = { serviceManager: new ServiceManager(), - setLaunchHandler: (callback: () => void) => launchHandlerCallback = callback, + setLaunchHandler: (callback: () => void) => { + document.removeEventListener('webOSLaunch', launchHandlerCallback); + document.removeEventListener('webOSRelaunch', launchHandlerCallback); + + launchHandlerCallback = callback; + document.addEventListener('webOSLaunch', launchHandlerCallback); + document.addEventListener('webOSRelaunch', launchHandlerCallback); + }, + setKeyDownHandler: (callback: () => void) => { + document.removeEventListener('keydown', keyDownEventHandler); + + keyDownEventHandler = callback; + document.addEventListener('keydown', keyDownEventHandler); + }, + setKeyUpHandler: (callback: () => void) => { + document.removeEventListener('keyup', keyUpEventHandler); + + keyUpEventHandler = callback; + document.addEventListener('keyup', keyUpEventHandler); + }, loadPage: loadPage }; document.addEventListener('webOSLaunch', launchHandlerCallback); document.addEventListener('webOSRelaunch', launchHandlerCallback); +document.addEventListener('keydown', keyDownEventHandler); +document.addEventListener('keyup', keyUpEventHandler); loadPage('./main_window/index.html'); diff --git a/receivers/webos/fcast-receiver/src/main/Preload.ts b/receivers/webos/fcast-receiver/src/main/Preload.ts index 6069294..b68b495 100644 --- a/receivers/webos/fcast-receiver/src/main/Preload.ts +++ b/receivers/webos/fcast-receiver/src/main/Preload.ts @@ -109,6 +109,7 @@ try { }; const launchHandler = () => { + // Launch handler not supported in simulator due to JSON parsing errors of launch parameters const params = window.webOSDev.launchParams(); logger.info(`Main: (Re)launching FCast Receiver with args: ${JSON.stringify(params)}`); diff --git a/receivers/webos/fcast-receiver/src/main/Renderer.ts b/receivers/webos/fcast-receiver/src/main/Renderer.ts index f3df63b..d1e086a 100644 --- a/receivers/webos/fcast-receiver/src/main/Renderer.ts +++ b/receivers/webos/fcast-receiver/src/main/Renderer.ts @@ -1,4 +1,4 @@ -import 'common/main/Renderer'; +import { keyDownEventHandler, keyUpEventHandler } from 'common/main/Renderer'; import { RemoteKeyCode } from 'lib/common'; import * as common from 'lib/common'; @@ -29,6 +29,9 @@ backgroundVideo.onplaying = () => { backgroundVideo.onplaying = null; }; +window.parent.webOSApp.setKeyDownHandler(keyDownEventHandler); +window.parent.webOSApp.setKeyUpHandler(keyUpEventHandler); + export function onQRCodeRendered() { qrCodeRendered = true; } diff --git a/receivers/webos/fcast-receiver/src/player/Renderer.ts b/receivers/webos/fcast-receiver/src/player/Renderer.ts index 1961153..15b2f0d 100644 --- a/receivers/webos/fcast-receiver/src/player/Renderer.ts +++ b/receivers/webos/fcast-receiver/src/player/Renderer.ts @@ -20,6 +20,8 @@ import { formatDuration, skipBack, skipForward, + keyDownEventHandler, + keyUpEventHandler, } from 'common/player/Renderer'; import { RemoteKeyCode } from 'lib/common'; import * as common from 'lib/common'; @@ -28,6 +30,9 @@ const captionsBaseHeightCollapsed = 150; const captionsBaseHeightExpanded = 320; const captionsLineHeight = 68; +window.parent.webOSApp.setKeyDownHandler(keyDownEventHandler); +window.parent.webOSApp.setKeyUpHandler(keyUpEventHandler); + export function targetPlayerCtrlStateUpdate(event: PlayerControlEvent): boolean { let handledCase = false; diff --git a/receivers/webos/fcast-receiver/src/viewer/Renderer.ts b/receivers/webos/fcast-receiver/src/viewer/Renderer.ts index d758edf..9bb751d 100644 --- a/receivers/webos/fcast-receiver/src/viewer/Renderer.ts +++ b/receivers/webos/fcast-receiver/src/viewer/Renderer.ts @@ -1,7 +1,10 @@ -import { PlayerControlEvent, playerCtrlStateUpdate, onPlay, onPlayPlaylist, setPlaylistItem, playlistIndex } from 'common/viewer/Renderer'; +import { PlayerControlEvent, playerCtrlStateUpdate, onPlay, onPlayPlaylist, setPlaylistItem, playlistIndex, keyDownEventHandler, keyUpEventHandler } from 'common/viewer/Renderer'; import { RemoteKeyCode } from 'lib/common'; import * as common from 'lib/common'; +window.parent.webOSApp.setKeyDownHandler(keyDownEventHandler); +window.parent.webOSApp.setKeyUpHandler(keyUpEventHandler); + export function targetPlayerCtrlStateUpdate(event: PlayerControlEvent): boolean { let handledCase = false; return handledCase;