var widgetAPI = null; var tvKey = null; var pluginObj = null; try { widgetAPI = new Common.API.Widget(); tvKey = new Common.API.TVKeyValue(); pluginObj = new Common.API.Plugin(); } catch (e) { } /* * Config.deviceType is used to differentiate main devices. * Config.deviceType == 0 is a Samsung ES Series Device (2012) * Config.deviceType != 0 is currently a Chrome Browser (Only GUI, no Video Playback) * * In order to adjust to other devices: * Config.js: realization of persistent storage for variable "Config.serverUrl" (URL of server plugin) * * Handle KeyCodes: global variable tvKey holds an enum * event.keyCode: is used to get the key pressed * * Display.GetEpochTime: returns the current time (UTC) in seconds * * Player: All operations to get the video playing * * URL suffix handling should be in Player * mFormat should be in Config or Main */ /* * TODO: * Audio Track Errors should be rendered differently * Comm Error, when a new recording is added * Clean Player APIs * Keep State of Recording Sortings * Issue, whether is a "_" folder * Use Flash Player for YT * Check that getBuffer is only used for PDL recordings and Live... * Consider ? in reccmds and commands */ var Main = { state : 0, // selectScreen selectedVideo : 0, olTimeout : 3000, mode : 0, mute : 0, UP : 0, DOWN : 1, WINDOW : 0, FULLSCREEN : 1, NMUTE : 0, YMUTE : 1, eMAIN : 0, // state Main Select eLIVE : 1, // State Live Select Screen / Video Playing eREC : 2, // State Recording Select Screen / Video Playing eMED : 3, // State Media Select Screen / Video Playing eTMR : 4, // State Timer Screen eURLS : 5, // State Urls eCMDS : 6, // Command Conf eSRVR : 7, // State Select Server eOPT : 8, // Options defKeyHndl : null, selectMenuKeyHndl : null, playStateKeyHndl : null, livePlayStateKeyHndl : null, menuKeyHndl : null, }; $(document).unload(function(){ Main.onUnload (); }); Main.onUnload = function() { Server.notifyServer("stopped"); Player.deinit(); }; $(document).ready(function(){ Main.onLoad (); }); Main.onLoad = function() { window.onShow = showHandler; window.onshow = showHandler; Network.init(); try { widgetAPI.sendReadyEvent(); } catch (e) { // Not a TV set. Use Config.serverAddrDefault as server address Config.deviceType = 1; tvKey = Main.tvKeys; Config.serverUrl = "http://" + Config.serverAddrDefault; Main.log("Not a Samsung Smart TV" ); } $.ajaxSetup ({ cache: false }); Display.init(); Notify.init(); Spinner.init(); Helpbar.init(); Options.init(); OverlayMenu.init(); this.defKeyHndl = new cDefaulKeyHndl; this.playStateKeyHndl = new cPlayStateKeyHndl(this.defKeyHndl); this.livePlayStateKeyHndl = new cLivePlayStateKeyHndl(this.defKeyHndl); this.menuKeyHndl = new cMenuKeyHndl(this.defKeyHndl); this.selectMenuKeyHndl = new cSelectMenuKeyHndl(this.defKeyHndl); ClockHandler.start("#selectNow"); Config.getWidgetVersion(); Config.init(); }; showHandler = function() { NNaviPlugin = document.getElementById("pluginObjectNNavi"); NNaviPlugin.SetBannerState(1); pluginObj.unregistKey(tvKey.KEY_VOL_UP); pluginObj.unregistKey(tvKey.KEY_VOL_DOWN); pluginObj.unregistKey(tvKey.KEY_MUTE); pluginObj.unregistKey(tvKey.KEY_PANEL_VOL_UP); pluginObj.unregistKey(tvKey.KEY_PANEL_VOL_DOWN); }; // Called by Config, when done Main.init = function () { Main.log("Main.init()"); if (Config.verboseStart == true) Display.showPopup ("Config done: Main.init() now" ); if (Config.debug == true) { if (Config.verboseStart == true) Display.showPopup ("Main.init: widgetdebug is true. Logging to (" + Config.serverUrl + ")"); Main.logToServer = function (msg) { if (Config.serverUrl == "" ) return; var XHRObj = new XMLHttpRequest(); XHRObj.open("POST", Config.serverUrl + "/log", true); XHRObj.send("CLOG: " + msg); }; } this.state = Main.eMAIN; SelectScreen.init(); Buttons.init(); if ( Player.init() && Server.init() ) { // Start retrieving data from server Server.dataReceivedCallback = function() { /* Use video information when it has arrived */ Display.setVideoList(Main.selectedVideo, Main.selectedVideo); Spinner.hide(); Display.show(); if (Data.createAccessMap == true) { Data.dumpDirectAccessMap(); } if (Main.state == Main.eLIVE) { Epg.startEpgUpdating(); } }; UrlsFetcher.dataReceivedCallback = function() { /* Use video information when it has arrived */ Display.setVideoList(Main.selectedVideo, Main.selectedVideo); Spinner.hide(); Display.show(); }; } else { Main.log("Failed to initialise"); } // Enable key event processing this.enableKeys(); Server.updateVdrStatus(); HeartbeatHandler.start(); DirectAccess.init(); Comm.init(); Timers.init(); ImgViewer.init(); //set popup to normal timeout duration Display.popupOlHandler.olDelay = 3*1000; Config.verboseStart = false; if (Config.deviceType == 0){ Main.log("ProductInfo= " + deviceapis.tv.info.getProduct()); Main.logToServer("ProductInfo= " + deviceapis.tv.info.getProduct()); Main.logToServer("isTvSet= " + Main.isTvSet()); } // TestHandler.showMenu(20); // window.setTimeout(function() {Config.updateContext("192.168.1.142:8000"); }, (10*1000)); // DirectAccess.show(); // Timers.init(); // Display.initOlForRecordings(); /* * Fetch JS file */ if (Config.uploadJsFile == true) { Main.logToServer ("Upload: " + Config.uploadJsFilename ); try { xhttp=new XMLHttpRequest(); xhttp.open("GET","$MANAGER_WIDGET/Common/webapi/1.0/webapis.js", false); xhttp.send(""); xmlDoc=xhttp.responseText; Main.logToServer (xmlDoc); } catch (e) { Main.logToServer ("Upload Error!"); }; } // Read widget conf. find the file to log /* xhttp=new XMLHttpRequest(); xhttp.open("GET","$MANAGER_WIDGET/Common/API/TVKeyValue.js",false); xhttp.send(""); xmlDoc=xhttp.responseText; Main.logToServer (xmlDoc); */ }; Main.log = function (msg) { // alert redirect if (Config.deviceType == 0) { alert (msg); } else { console.log(msg); } }; Main.logToServer = function (msg) { //replaced, when widget.debug is true /* if (Config.serverUrl == "" ) return; var XHRObj = new XMLHttpRequest(); XHRObj.open("POST", Config.serverUrl + "/log", true); XHRObj.send("CLOG: " + msg); */ }; Main.testUrls = function () { Main.log("################## Main.testUrls"); Spinner.show(); UrlsFetcher.autoplay = "6927QNxye6k"; UrlsFetcher.appendGuid("6927QNxye6k"); }; Main.isTvSet = function () { if (deviceapis.tv.info.getProduct() == 0) //deviceapis.tv.info.PRODUCT_TYPE_TV return true; else return false; }; Main.changeState = function (state) { Main.log("change state: OldState= " + this.state + " NewState= " + state); Main.logToServer("change state: OldState= " + this.state + " NewState= " + state); var old_state = this.state; this.state = state; ClockHandler.stop(); Epg.stopUpdates(); Server.updateVdrStatus(); switch (this.state) { case Main.eMAIN: Main.selectMenuKeyHndl.select = old_state; Main.log ("old Select= " + Main.selectMenuKeyHndl.select); Display.resetSelectItems(old_state); $("#selectScreen").show(); ClockHandler.start("#selectNow"); Display.hide(); Data.reset (); //TODO: Should reset progress bar as well Display.resetVideoList(); Display.resetDescription (); break; case Main.eLIVE: $("#selectScreen").hide(); ClockHandler.start("#logoNow"); Display.show(); Main.selectedVideo = 0; Main.liveSelected(); break; case Main.eREC: $("#selectScreen").hide(); ClockHandler.start("#logoNow"); Display.show(); Main.selectedVideo = 0; Main.recordingsSelected(); break; case Main.eMED: $("#selectScreen").hide(); ClockHandler.start("#logoNow"); Display.show(); Main.selectedVideo = 0; Main.mediaSelected(); break; case Main.eURLS: $("#selectScreen").hide(); ClockHandler.start("#logoNow"); Display.show(); Main.selectedVideo = 0; Main.urlsSelected(); break; case Main.eCMDS: CmdHandler.showMenu(); break; case Main.eTMR: $("#selectScreen").hide(); ClockHandler.start("#logoNow"); Timers.show(); break; case Main.eSRVR: Config.vdrServers.checkServers(); break; case Main.eOPT: // Options // Options.init(); $("#selectScreen").hide(); Options.show(); // Main.optionsSelected(); break; } }; Main.liveSelected = function() { Server.retries = 0; Player.stopCallback = function() { Display.show(); }; Player.isLive = true; Server.setSort(false); Server.errorCallback = Main.serverError; Data.createAccessMap = true; Spinner.show(); Server.fetchVideoList(Config.serverUrl + "/channels.xml?channels="+Config.liveChannels); /* Request video information from server */ }; Main.recordingsSelected = function() { Server.retries = 0; Player.stopCallback = function() { Display.show(); Data.getCurrentItem().childs[Main.selectedVideo].payload.isnew = "false"; var res = Display.getDisplayTitle (Data.getCurrentItem().childs[Main.selectedVideo]); Display.setVideoItem(Display.videoList[Display.currentWindow +Display.FIRSTIDX], res); Server.saveResume (); }; Server.errorCallback = Main.serverError; Server.setSort(true); Data.sortType = Config.curSortType; /* if (Config.format == "") { Server.fetchVideoList(Config.serverUrl + "/recordings.xml?model=samsung"); Main.log("fetchVideoList from: " + Config.serverUrl + "/recordings.xml?model=samsung"); } else { Main.logToServer("Using format " + Config.format); if (Config.format == "") Server.fetchVideoList(Config.serverUrl + "/recordings.xml?model=samsung&has4hd=false"); else Server.fetchVideoList(Config.serverUrl + "/recordings.xml?model=samsung&has4hd=false&type="+Config.format); } */ Spinner.show(); Server.fetchVideoList(Config.serverUrl + "/recordings.xml"); /* Request video information from server */ Main.log("fetchVideoList from: " + Config.serverUrl + "/recordings.xml"); }; Main.mediaSelected = function() { Server.retries = 0; Player.stopCallback = function() { // Display.show(); }; Server.errorCallback = function (msg) { Display.showPopup(msg); Main.changeState(0); }; Server.setSort(true); Spinner.show(); Server.fetchVideoList(Config.serverUrl + "/media.xml"); /* Request video information from server */ }; Main.urlsSelected = function() { Server.retries = 0; /* var plyr = $("<object>", {type : "application/x-shockwave-flash", id : "ytplayer", width : "960", height : "540", style : "position: absolute; left: 0px; top:0px; z-index: 0; display: none"}); plyr.append($("<param>", {name : "movie", value : "http://www.youtube.com/apiplayer?&enablejsapi=1&version=2&playerapiid=ytplayer"})); plyr.append($("<param>", {name : "allowFullScreen", value : "true"})); plyr.append($("<param>", {name : "allowScriptAccess", value : "always"})); $('body').append(plyr); */ Player.stopCallback = function() { // Display.show(); }; Server.errorCallback = function (msg) { Display.showPopup(msg); Main.changeState(0); }; Server.setSort(false); Spinner.show(); UrlsFetcher.fetchUrlList(); }; Main.optionsSelected = function() { Main.log ("Main.optionsSelected"); }; Main.serverError = function(errorcode) { Main.logToServer("Main.serverError state= " + Main.state + " retries= " + Server.retries); switch (Server.retries) { case 0: case 1: case 2: switch (Main.state) { case Main.eLIVE: // live Server.fetchVideoList( Config.serverUrl + "/channels.xml"); /* Request video information from server */ break; case Main.eRECE: Server.fetchVideoList( Config.serverUrl + "/recordings.xml"); /* Request video information from server */ break; } break; case 3: case 4: switch (Main.state) { case Main.eLIVE: // live Server.fetchVideoList( Config.serverUrl + "/channels.xml?mode=nodesc"); /* Request video information from server */ break; case Main.eRECE: Server.fetchVideoList( Config.serverUrl + "/recordings.xml?mode=nodesc"); /* Request video information from server */ break; } break; default: Display.showPopup(msg); Main.changeState(0); break; }; /* if (Server.retries < 2) { switch (this.state) { case Main.eLIVE: // live Server.fetchVideoList( Config.serverUrl + "/channels.xml?mode=nodesc"); break; case Main.eRECE: Server.fetchVideoList( Config.serverUrl + "/recordings.xml?mode=nodesc"); break; } } else { Display.showPopup(msg); Main.changeState(0); } */ }; Main.enableKeys = function() { Main.logToServer("Main.enableKeys"); document.getElementById("anchor").focus(); }; Main.keyDown = function() { var ev = event || window.event; var keyCode = ev.keyCode; Main.logToServer("State= " + this.state + ": Key pressed: " + Main.getKeyCode(keyCode)); Main.log("State= " + this.state + ": Key pressed: " + Main.getKeyCode(keyCode)); switch (this.state) { case 0: // selectView this.selectMenuKeyHndl.handleKeyDown(keyCode); break; case Main.eLIVE: // Live Main.log("Live - Main.keyDown PlayerState= " + Player.getState()); if(Player.getState() == Player.STOPPED) { // Menu Key this.menuKeyHndl.handleKeyDown(keyCode); } else { // Live State Keys this.livePlayStateKeyHndl.handleKeyDown(keyCode); }; break; case Main.eREC: case Main.eMED: case Main.eURLS: // recordings // Main.log("Recordings - Main.keyDown PlayerState= " + Player.getState()); if(Player.getState() == Player.STOPPED) { // Menu Key this.menuKeyHndl.handleKeyDown(keyCode); } else { // Play State Keys this.playStateKeyHndl.handleKeyDown(keyCode); }; break; case Main.eOPT: // Options.onInput(); // Main.log ("ERROR: Wrong State"); break; }; }; Main.playItem = function (url) { Main.log(Main.state + " playItem for " +Data.getCurrentItem().childs[Main.selectedVideo].payload.link); var start_time = Data.getCurrentItem().childs[Main.selectedVideo].payload.start; var duration = Data.getCurrentItem().childs[Main.selectedVideo].payload.dur; var now = Display.GetUtcTime(); // var now = (new MyDate()).getTimeSec(); // document.getElementById("olRecProgressBar").style.display="none"; // Player.mFormat = Player.eUND; // default val switch (this.state) { case Main.eLIVE: // Live // Check for updates Display.hide(); Display.showProgress(); Player.isLive = true; Display.updateOlForLive (start_time, duration, now); Main.logToServer ("Live now= " + now + " StartTime= " + Data.getCurrentItem().childs[Main.selectedVideo].payload.start + " offset= " +Player.cptOffset ); Main.logToServer("Live Content= " + Data.getCurrentItem().childs[Main.selectedVideo].title + " dur= " + Data.getCurrentItem().childs[Main.selectedVideo].payload.dur); Player.guid = Data.getCurrentItem().childs[Main.selectedVideo].payload.guid; Player.setVideoURL( Data.getCurrentItem().childs[Main.selectedVideo].payload.link); Player.playVideo(-1); break; case Main.eREC: Player.setPdl(); // var url_ext = ""; // Player.mFormat = Player.ePDL; // Server.getResume(Player.guid); Main.log(" playItem: now= " + now + " start_time= " + start_time + " dur= " + duration + " (Start + Dur - now)= " + ((start_time + duration) -now)); Main.logToServer(" playItem: now= " + now + " start_time= " + start_time + " dur= " + duration + " (Start + Dur - now)= " + ((start_time + duration) -now)); Player.setDuration(); //thlo Player.totalTime = Data.getCurrentItem().childs[Main.selectedVideo].payload.dur * 1000; //thlo Player.totalTimeStr =Display.durationString(Player.totalTime / 1000.0); //thlo if (Config.usePdlForRecordings == false) { Main.log("Main.playItem: use AHS for recordings"); Main.logToServer("Main.playItem: use AHS for recordings"); if ((Data.getCurrentItem().childs[Main.selectedVideo].payload.fps <= 30) && (Data.getCurrentItem().childs[Main.selectedVideo].payload.ispes == "false")) { // in case fps is smaller than 30 and ts recording use HLS or HAS if (Config.format == "hls") { Player.setHls(); // Player.mFormat = Player.eHLS; // url_ext = "/manifest-seg.m3u8|COMPONENT=HLS"; } if (Config.format == "has") { Player.setHas(); // Player.mFormat = Player.eHAS; // url_ext = "/manifest-seg.mpd|COMPONENT=HAS"; } } } if ((now - (start_time + duration)) < 0) { // still recording Main.log("*** Still Recording! ***"); Main.logToServer("*** Still Recording!: now= " + now + " start_time= " + start_time + " dur= " + duration +" ***"); Player.isRecording = true; Player.startTime = start_time; Player.duration = duration; // EpgDuration // document.getElementById("olRecProgressBar").style.display="block"; $("#olRecProgressBar").show(); Display.updateRecBar(start_time, duration); // New recording in progress handling Player.setPdl(); // url_ext = ""; // Player.mFormat = Player.ePDL; /* if ((Data.getCurrentItem().childs[Main.selectedVideo].payload.fps <= 30) && (Data.getCurrentItem().childs[Main.selectedVideo].payload.ispes == "false")) { // HLS only works for framerate smaller 30fps // HLS only works for TS streams if (Config.format == "hls") { Player.mFormat = Player.eHLS; url_ext = "/manifest-seg.m3u8|COMPONENT=HLS"; } Player.mFormat = Player.eHAS; if (Config.format == "has") { url_ext = "/manifest-seg.mpd|COMPONENT=HAS"; } } */ } // Player.setVideoURL( Data.getCurrentItem().childs[Main.selectedVideo].payload.link + url_ext); Player.setVideoURL( Data.getCurrentItem().childs[Main.selectedVideo].payload.link); Player.guid = Data.getCurrentItem().childs[Main.selectedVideo].payload.guid; Main.log("Main.playItem - Player.guid= " +Player.guid); Display.setOlTitle(Data.getCurrentItem().childs[Main.selectedVideo].title); // Main.log("IsNew= " +Data.getCurrentItem().childs[Main.selectedVideo].payload.isnew); Player.OnCurrentPlayTime(0); // updates the HTML elements of the Progressbar Buttons.show(); break; case Main.eMED: if (ImgViewer.isImage() == true) { ImgViewer.show(); } else { Display.hide(); Display.showProgress(); Player.mFormat = Player.ePDL; Main.log(" playItem: now= " + now + " start_time= " + start_time + " dur= " + duration + " (Start + Dur - now)= " + ((start_time + duration) -now)); Display.setOlTitle(Data.getCurrentItem().childs[Main.selectedVideo].title); var url = Data.getCurrentItem().childs[Main.selectedVideo].payload.link; var ext = url.split('.').pop(); if ((ext == "M3U8") || (ext == "m3u8") ) Player.setHls(); // url += "|COMPONENT=HLS"; if ((ext == "MPD") || (ext == "mpd") ) Player.setHas(); // url += "|COMPONENT=HAS"; Main.log ("Url= " + url); Player.setVideoURL( url); // Player.setVideoURL( Data.getCurrentItem().childs[Main.selectedVideo].payload.link); Player.playVideo(-1); Player.guid = "unknown"; } break; case Main.eURLS: Display.hide(); Display.showProgress(); Player.setPdl(); // Player.mFormat = Player.ePDL; Main.log(" playItem: now= " + now + " start_time= " + start_time + " dur= " + duration + " (Start + Dur - now)= " + ((start_time + duration) -now)); Display.setOlTitle(Data.getCurrentItem().childs[Main.selectedVideo].title); Main.log("playItem: guid= " + Data.getCurrentItem().childs[Main.selectedVideo].payload.guid); UrlsFetcher.getYtVideoUrl( Data.getCurrentItem().childs[Main.selectedVideo].payload.guid); break; default: Main.logToServer("ERROR in Main.playItem: should not be here"); break; }; }; Main.selectPageUp = function() { Main.previousVideo(Display.getNumberOfVideoListItems()); var first_item = this.selectedVideo - Display.currentWindow; if (first_item < 0 ) first_item = 0; Main.log("selectPageUp: this.selectedVideo= " + this.selectedVideo + " first_item= " + first_item); Display.setVideoList(this.selectedVideo, first_item); }; Main.selectPageDown = function() { Main.nextVideo (Display.getNumberOfVideoListItems()); var first_item = this.selectedVideo - Display.currentWindow; Main.log("selectPageDown: this.selectedVideo= " + this.selectedVideo + " first_item= " + first_item + " curWind= " + Display.currentWindow); Display.setVideoList(this.selectedVideo, first_item); }; Main.nextVideo = function(no) { // Just move the selectedVideo pointer and ensure wrap around // Should I do anything, when no < Data.getVideoCount()? if (no > Data.getVideoCount()) return; Main.log("Main.nextVideo: selVid(in)= " + this.selectedVideo + " no= " + no + " vids= " + Data.getVideoCount() + " (no% Data.getVideoCount())= " +(no% Data.getVideoCount())); this.selectedVideo = (this.selectedVideo + (no% Data.getVideoCount())) % Data.getVideoCount(); Main.log("Main.nextVideo= " + this.selectedVideo + " no= " + no); }; Main.previousVideo = function(no) { // Just move the selectedVideo pointer and ensure wrap around // Issue: I deduct a number, which is larger than videoCount // only jumps, which are mod videoCount? if (no > Data.getVideoCount()) return; this.selectedVideo = (this.selectedVideo - (no% Data.getVideoCount())); if (this.selectedVideo < 0) { Main.log("Main.previousVideo: below Zero (" +this.selectedVideo+"), adding " + Data.getVideoCount()); this.selectedVideo += Data.getVideoCount(); } Main.log("Main.previousVideo= " + this.selectedVideo + " no= " +no); }; Main.selectNextVideo = function() { Player.stopVideo(); Main.nextVideo(1); // this.updateCurrentVideo(down); Display.setVideoListPosition(this.selectedVideo, Main.DOWN); }; Main.selectPreviousVideo = function() { Player.stopVideo(); Main.previousVideo(1); // this.updateCurrentVideo(up); Display.setVideoListPosition(this.selectedVideo, Main.UP); }; //--------------------------------------------------- // PlayState Key Handler //--------------------------------------------------- function cPlayStateKeyHndl(def_hndl) { this.defaultKeyHandler = def_hndl; this.handlerName = "PlayStateKeyHanlder"; Main.log(this.handlerName + " created"); this.lastDragRightUp = 0; this.lastDragRightDn = 0; this.lastDragTopRt = 0; this.lastDragTopLt = 0; }; cPlayStateKeyHndl.prototype.handleKeyDown = function (keyCode) { // var keyCode = event.keyCode; if(Player.getState() == Player.STOPPED) { Main.log("ERROR: Wrong state - STOPPED"); return; } var smart_touch_timeout = Config.smartTouchTimeout / 1000; // Main.log(this.handlerName+": Key pressed: " + Main.getKeyCode(keyCode)); // Main.logToServer(this.handlerName+": Key pressed: " + Main.getKeyCode(keyCode)); if ((keyCode >= 50100001) && (keyCode <= 50400050)) { if ((keyCode >= 50400001) && (keyCode <= 50400025)) // Smart Touch, polierter Steg oben, nach rechts, langsam keyCode = 50400001; if ((keyCode >= 50400025) && (keyCode <= 50400050)) { // Smart Touch, polierter Steg oben, nach rechts, langsam keyCode = 50400001; smart_touch_timeout = Config.smartTouchTimeout / 2000; } if ( (keyCode >= 50300001) && (keyCode <= 50300025) ) // Smart Touch, polierter Steg oben, nach links keyCode = 50300001; if ( (keyCode >= 50300025) && (keyCode <= 50300050) ){ // Smart Touch, polierter Steg oben, nach links keyCode = 50300001; smart_touch_timeout = Config.smartTouchTimeout / 2000; } if ((keyCode >= 50100001) && (keyCode <= 50100050)) // Smart Touch, polierter Steg rechts & links, nach oben keyCode = 50100001; if ((keyCode >= 50200001) && (keyCode <= 50200050)) // Smart Touch, polierter Steg rechts & links, nach oben keyCode = 50200001; Main.logToServer(this.handlerName+": SmartTouch: " +keyCode + " to= " + smart_touch_timeout); } switch(keyCode) { case tvKey.KEY_TOOLS: Helpbar.showHelpbar(); break; case tvKey.KEY_1: Main.log("KEY_1 pressed"); Player.numKeyJump(1); break; case tvKey.KEY_2: Main.log("KEY_2 pressed"); Player.numKeyJump(2); break; case tvKey.KEY_3: Main.log("KEY_3 pressed"); Player.numKeyJump(3); break; case tvKey.KEY_4: Main.log("KEY_4 pressed"); Player.numKeyJump(4); break; case tvKey.KEY_5: Main.log("KEY_5 pressed"); Player.numKeyJump(5); break; case tvKey.KEY_6: Main.log("KEY_6 pressed"); Player.numKeyJump(6); break; case tvKey.KEY_7: Main.log("KEY_7 pressed"); Player.numKeyJump(7); break; case tvKey.KEY_8: Main.log("KEY_8 pressed"); Player.numKeyJump(8); break; case tvKey.KEY_9: Main.log("KEY_9 pressed"); Player.numKeyJump(9); break; case tvKey.KEY_RIGHT: Main.log("Right: Skip Forward"); Display.showProgress(); if (Player.trickPlaySpeed != 1) { Notify.showNotify("Trickplay!", true); } else Player.skipForwardVideo(); break; case tvKey.KEY_LEFT: Main.log("Left: Skip Backward"); Display.showProgress(); if (Player.trickPlaySpeed != 1) { Notify.showNotify("Trickplay!", true); } else Player.skipBackwardVideo(); break; /* Works only for progressive streams, not Adaptive HTTP */ case 50400001: // Smart Touch, polierter Steg oben, nach rechts var now = Display.GetUtcTime(); // var now = (new MyDate()).getTimeSec(); if ((now - this.lastDragTopRt) < smart_touch_timeout) { return; } this.lastDragTopRt = now; case tvKey.KEY_FF: Main.log("FF"); Display.showProgress(); /* if (Player.isRecording == true) { Notify.showNotify("Recording!!!", true); } else */ // if (Player.mFormat != Player.ePDL ) // if (Player.mFormat == Player.eHLS ) if (Player.isHls()) Notify.showNotify("Not supported", true); else Player.fastForwardVideo(); break; case 50300001: // Smart Touch, polierter Steg oben, nach links var now = Display.GetUtcTime(); // var now = (new MyDate()).getTimeSec(); if ((now - this.lastDragTopLt) < smart_touch_timeout) { return; } this.lastDragTopLt = now; case tvKey.KEY_RW: Main.log("RW"); Display.showProgress(); /* if (Player.isRecording == true) { Notify.showNotify("Recording!!!", true); } else */ // if (Player.mFormat != Player.ePDL ) // if (Player.mFormat == Player.eHLS ) if (Player.isHls()) Notify.showNotify("Not supported", true); else Player.RewindVideo(); break; case 50100001 : // Smart Touch, polierter Steg rechts & links, nach oben var now = Display.GetUtcTime(); // var now = (new MyDate()).getTimeSec(); if ((now - this.lastDragRightUp) < smart_touch_timeout) { return; } this.lastDragRightUp = now; case tvKey.KEY_ENTER: case tvKey.KEY_PLAY: case tvKey.KEY_PANEL_ENTER: Main.log("ENTER"); if(Player.getState() == Player.PAUSED) { Player.resumeVideo(); } if (Player.isInTrickplay() == true) { Player.ResetTrickPlay(); } else if (Display.isProgressOlShown()) { Player.adjustSkipDuration(0); // reset skip duration to default Display.resetStartStop(); } Display.showProgress(); break; case tvKey.KEY_RETURN: case tvKey.KEY_PANEL_RETURN: case tvKey.KEY_STOP: Main.log("STOP"); Player.stopVideo(); try { widgetAPI.blockNavigation(event); } catch (e) { } break; case 50200001: // Smart Touch, polierter Steg rechts & links, nach oben var now = Display.GetUtcTime(); // var now = (new MyDate()).getTimeSec(); if ((now - this.lastDragRightDn) < smart_touch_timeout) { return; } this.lastDragRightDn = now; case tvKey.KEY_PAUSE: Main.log("PAUSE"); if(Player.getState() == Player.PAUSED) { Player.resumeVideo(); } else { Player.pauseVideo(); } break; case tvKey.KEY_UP: Player.adjustSkipDuration(1); Display.showProgress(); break; case tvKey.KEY_DOWN: Player.adjustSkipDuration(2); Display.showProgress(); break; case tvKey.KEY_INFO: Display.showInfo(Main.selectedVideo); break; case tvKey.KEY_RED: // for Smart Touch FBs case tvKey.KEY_ASPECT: Player.toggleAspectRatio(); break; case tvKey.KEY_BLUE: Player.nextAudioTrack(); break; case tvKey.KEY_YELLOW: Player.nextSubtitleTrack(); break; case tvKey.KEY_SUB_TITLE: // (1089) BD Player Key for Green case tvKey.KEY_3D: case tvKey.KEY_GREEN: Player.toggle3DEffectMode(); widgetAPI.blockNavigation(event); break; break; default: Main.log("Calling Default Key Hanlder"); this.defaultKeyHandler.handleDefKeyDown(keyCode); break; } }; //--------------------------------------------------- // Live Play State Key Handler //--------------------------------------------------- function cLivePlayStateKeyHndl(def_hndl) { this.defaultKeyHandler = def_hndl; this.handlerName = "LivePlayStateKeyHanlder"; Main.log(this.handlerName + " created"); }; cLivePlayStateKeyHndl.prototype.handleKeyDown = function (keyCode) { // var keyCode = event.keyCode; if(Player.getState() == Player.STOPPED) { Main.log("ERROR: Wrong state - STOPPED"); return; } // Main.log(this.handlerName+": Key pressed: " + Main.getKeyCode(keyCode)); switch(keyCode) { case tvKey.KEY_TOOLS: Helpbar.showHelpbar(); break; case tvKey.KEY_ASPECT: Player.toggleAspectRatio(); break; case tvKey.KEY_0: DirectAccess.show("0"); break; case tvKey.KEY_1: DirectAccess.show("1"); break; case tvKey.KEY_2: DirectAccess.show("2"); break; case tvKey.KEY_3: DirectAccess.show("3"); break; case tvKey.KEY_4: DirectAccess.show("4"); break; case tvKey.KEY_5: DirectAccess.show("5"); break; case tvKey.KEY_6: DirectAccess.show("6"); break; case tvKey.KEY_7: DirectAccess.show("7"); break; case tvKey.KEY_8: DirectAccess.show("8"); break; case tvKey.KEY_9: DirectAccess.show("9"); break; case tvKey.KEY_UP: case tvKey.KEY_CH_UP: Main.log("Prog Up"); Display.showProgress(); Player.stopVideo(); // Check, weather I am the last element of a folder. If yes, go one level up if (Main.selectedVideo == (Data.getVideoCount() -1)) { //Last VideoItem, check wrap around or folder fall-down if (Data.isRootFolder() != true) { // Main.selectedVideo = Data.folderUp(); var itm = Data.folderUp(); Main.selectedVideo = itm.id; } } Main.nextVideo(1); // increase and wrap // check, if new element is a folder again if (Data.getCurrentItem().childs[Main.selectedVideo].isFolder == true) { Data.selectFolder(Main.selectedVideo, Main.selectedVideo); Main.selectedVideo= 0; } // Main.nextVideo(1); Main.playItem(); break; case tvKey.KEY_RIGHT: Main.log("Right: Skip Forward"); Display.showProgress(); if (Player.trickPlaySpeed != 1) { Notify.showNotify("Trickplay!", true); } else Player.skipForwardVideo(); break; // case tvKey.KEY_4: case tvKey.KEY_DOWN: case tvKey.KEY_CH_DOWN: Main.log("Prog Down"); Display.showProgress(); Player.stopVideo(); // check, if I am the first element of a folder // if yes, then one up if (Main.selectedVideo == 0) { //First VideoItem, if (Data.isRootFolder() != true) { // Main.selectedVideo = Data.folderUp(); var itm = Data.folderUp(); Main.selectedVideo = itm.id; } } Main.previousVideo(1); // check, if new element is a folder again if (Data.getCurrentItem().childs[Main.selectedVideo].isFolder == true) { Data.selectFolder(Main.selectedVideo, Main.selectedVideo); Main.selectedVideo= Data.getVideoCount()-1; } Main.playItem(); break; case tvKey.KEY_ENTER: case tvKey.KEY_PLAY: case tvKey.KEY_PANEL_ENTER: Main.log("ENTER"); Display.hide(); Display.showProgress(); if(Player.getState() == Player.PAUSED) { Player.resumeVideo(); } break; case tvKey.KEY_LEFT: case tvKey.KEY_RETURN: case tvKey.KEY_PANEL_RETURN: case tvKey.KEY_STOP: Main.log("STOP"); Player.stopVideo(); // Display.setVideoList(Main.selectedVideo, Main.selectedVideo- ( Main.selectedVideo % (Display.LASTIDX +1))); //thlo: here if (Data.isRootFolder() != true) { Display.addHeadline(Data.getCurrentItem().title); Display.setVideoList(Main.selectedVideo, Main.selectedVideo- ( Main.selectedVideo % Display.getNumberOfVideoListItems())); } else { Display.removeHeadline(); Display.setVideoList(Main.selectedVideo, Main.selectedVideo- ( Main.selectedVideo % Display.getNumberOfVideoListItems())); } Display.show(); widgetAPI.blockNavigation(event); break; case tvKey.KEY_REC: case 73: Main.log("KEY_REC with guid= Data.getCurrentItem().childs[Main.selectedVideo].payload.guid"); // var timer_req = new addTimer(Data.getCurrentItem().childs[Main.selectedVideo].payload.guid); Server.addTimer(Data.getCurrentItem().childs[Main.selectedVideo].payload.guid); // use the guid and request the epg. // use the event id then issue the rec command case tvKey.KEY_PAUSE: Main.log("REC / PAUSE"); if(Player.getState() == Player.PAUSED) { Player.resumeVideo(); } else { Player.pauseVideo(); } // use the guid and request the epg. // use the event id then issue the rec command // Data.getCurrentItem().childs[Main.selectedVideo].payload. break; case tvKey.KEY_INFO: Display.showInfo(Main.selectedVideo); break; case tvKey.KEY_RED: // for Smart Touch FBs case tvKey.KEY_ASPECT: Player.toggleAspectRatio(); break; case tvKey.KEY_BLUE: Player.nextAudioTrack(); break; case tvKey.KEY_YELLOW: Player.nextSubtitleTrack(); break; case tvKey.KEY_SUB_TITLE: // BD Player Fix for Key Green (1089) case tvKey.KEY_3D: case tvKey.KEY_GREEN: Player.toggle3DEffectMode(); widgetAPI.blockNavigation(event); break; default: this.defaultKeyHandler.handleDefKeyDown(keyCode); break; } }; //--------------------------------------------------- //Menu Key Handler //--------------------------------------------------- function cMenuKeyHndl (def_hndl) { this.defaultKeyHandler = def_hndl; this.handlerName = "MenuKeyHandler"; Main.log(this.handlerName + " created"); }; cMenuKeyHndl.prototype.handleKeyDown = function (keyCode) { // var keyCode = event.keyCode; switch(keyCode) { case 65: Main.logToServer("a pressed"); Display.showInfo(Main.selectedVideo); break; case tvKey.KEY_TOOLS: Helpbar.showHelpbar(); break; case tvKey.KEY_0: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("0"); } break; case tvKey.KEY_1: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("1"); } break; case tvKey.KEY_2: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("2"); } break; case tvKey.KEY_3: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("3"); } break; case tvKey.KEY_4: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("4"); } break; case tvKey.KEY_5: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("5"); } break; case tvKey.KEY_6: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("6"); } break; case tvKey.KEY_7: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("7"); } break; case tvKey.KEY_8: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("8"); } break; case tvKey.KEY_9: if (Main.state == Main.eLIVE) { Main.log("cMenu DirectAccess: keyCode= " + keyCode); DirectAccess.show("9"); } break; case tvKey.KEY_RED: if ((Main.state == Main.eLIVE) || (Main.state == Main.eREC)) { RecCmdHandler.showMenu(Data.getCurrentItem().childs[Main.selectedVideo].payload.guid); } break; case tvKey.KEY_YELLOW: if (Main.state == Main.eURLS) { Buttons.ynShow(); } if (Main.state == Main.eMED) { Main.log("Delete YE Button"); Buttons.ynShow(); } break; case tvKey.KEY_BLUE: if (Main.state == Main.eREC) { //change sorting Spinner.show(); Data.nextSortType(); Main.selectedVideo = 0; Display.setVideoList(Main.selectedVideo, Main.selectedVideo); Spinner.hide(); } break; case tvKey.KEY_RIGHT: Main.log("Right"); Main.selectPageDown(); break; case tvKey.KEY_LEFT: Main.log("Left"); Main.selectPageUp(); break; case tvKey.KEY_DOWN: Main.log("DOWN"); Main.selectNextVideo(); break; case tvKey.KEY_UP: Main.log("UP"); Main.selectPreviousVideo(); break; case tvKey.KEY_ENTER: case tvKey.KEY_PLAY: case tvKey.KEY_PANEL_ENTER: Main.log("ENTER"); if (Data.getCurrentItem().childs[Main.selectedVideo].isFolder == true) { Main.log ("selectFolder= " +Main.selectedVideo); Data.selectFolder(Main.selectedVideo, (Main.selectedVideo - Display.currentWindow)); Main.selectedVideo= 0; Display.addHeadline(Data.getCurrentItem().title); Display.setVideoList(Main.selectedVideo, Main.selectedVideo); // thlo } else{ /* Display.hide(); Display.showProgress(); */ Main.playItem(); } break; // case tvKey.KEY_EXIT: case tvKey.KEY_RETURN: case tvKey.KEY_PANEL_RETURN: if (Data.isRootFolder() == true) { Main.log ("root reached"); Main.changeState(0); } else { // Main.selectedVideo = Data.folderUp(); var itm = Data.folderUp(); Main.selectedVideo = itm.id; Main.log("folderUp selectedVideo= " + Main.selectedVideo); if (Data.isRootFolder() == true) { Display.removeHeadline(); } else { Display.addHeadline(Data.getCurrentItem().title); } Display.setVideoList(Main.selectedVideo, itm.first); // thlo } widgetAPI.blockNavigation(event); break; default: Main.log(this.handlerName+": Key pressed: " + Main.getKeyCode(keyCode)); this.defaultKeyHandler.handleDefKeyDown(keyCode); break; } }; /* //--------------------------------------------------- // Select Menu Key Handler //--------------------------------------------------- function cSelectMenuKeyHndl (def_hndl) { this.defaultKeyHandler = def_hndl; this.handlerName = "SelectMenuKeyHandler"; Main.log(this.handlerName + " created"); this.select = 1; this.selectMax = 6; // Highest Select Entry }; cSelectMenuKeyHndl.prototype.handleKeyDown = function (event) { var keyCode = event.keyCode; Main.log(this.handlerName+": Key pressed: " + Main.getKeyCode(keyCode)); switch(keyCode) { case tvKey.KEY_1: Main.log("KEY_1 pressed"); this.select = 1; Main.changeState (this.select); break; case tvKey.KEY_2: Main.log("KEY_2 pressed"); this.select = 2; Main.changeState (this.select); break; case tvKey.KEY_3: Main.log("KEY_3 pressed"); this.select = 3; Main.changeState (this.select); break; case tvKey.KEY_4: Main.log("KEY_4 pressed"); this.select = 4; Main.changeState (this.select); break; case tvKey.KEY_5: Main.log("KEY_5 pressed"); this.select = 5; Main.changeState (this.select); break; case tvKey.KEY_6: Main.log("KEY_6 pressed"); this.select = 6; Main.changeState (this.select); break; case tvKey.KEY_ENTER: case tvKey.KEY_PLAY: case tvKey.KEY_PANEL_ENTER: Main.log("ENTER"); Main.log ("CurSelect= " + this.select); Main.changeState (this.select); break; //thlo: correct? case tvKey.KEY_DOWN: Display.unselectItem(document.getElementById("selectItem"+this.select)); if (++this.select > this.selectMax) this.select = 1; Display.selectItem(document.getElementById("selectItem"+this.select)); Main.log("DOWN " +this.select); break; case tvKey.KEY_UP: Display.unselectItem(document.getElementById("selectItem"+this.select)); if (--this.select < 1) this.select = this.selectMax; Display.selectItem(document.getElementById("selectItem"+this.select)); Main.log("UP "+ this.select); break; default: this.defaultKeyHandler.handleDefKeyDown(keyCode); break; } }; */ //--------------------------------------------------- // Default Key Handler //--------------------------------------------------- function cDefaulKeyHndl() { this.handlerName = "DefaultKeyHanlder"; Main.log(this.handlerName + " created"); }; cDefaulKeyHndl.prototype.handleDefKeyDown = function (keyCode) { Main.log("cDefaulKeyHndl::handleKeyDown: " + Main.getKeyCode(keyCode)); switch(keyCode) { case tvKey.KEY_EXIT: Main.log(this.handlerName +"Exit"); if (Main.state != 0) { Player.stopVideo(); Main.changeState(0); widgetAPI.blockNavigation(event); } else { Server.notifyServer("stopped"); widgetAPI.sendReturnEvent(); } break; default: Main.log(this.handlerName + "Unhandled key"); break; } }; // --------------------------------------------- // ----------------------------------------------- Main.getKeyCode = function(code) { var res = ""; if (Config.deviceType != 0) { // Not a Samsung res = "Unknown Key (KeyCode= " + code + ")"; return res; } switch(code) { case tvKey.KEY_1: res = "KEY_1"; break; case tvKey.KEY_2: res = "KEY_2"; break; case tvKey.KEY_3: res = "KEY_3"; break; case tvKey.KEY_4: res = "KEY_4"; break; case tvKey.KEY_5: res = "KEY_5"; break; case tvKey.KEY_6: res = "KEY_6"; break; case tvKey.KEY_7: res = "KEY_7"; break; case tvKey.KEY_8: res = "KEY_8"; break; case tvKey.KEY_9: res = "KEY_9"; break; case tvKey.KEY_TOOLS: res = "KEY_TOOLS"; break; case tvKey.KEY_TOOLS: res = "KEY_TOOLS"; break; case tvKey.KEY_TOOLS: res = "KEY_TOOLS"; break; case tvKey.KEY_UP: res = "KEY_UP"; break; case tvKey.KEY_DOWN: res = "KEY_DOWN"; break; case tvKey.KEY_LEFT: res = "KEY_LEFT"; break; case tvKey.KEY_RIGHT: res = "KEY_RIGHT"; break; case tvKey.KEY_WHEELDOWN: res = "KEY_WHEELDOWN"; break; case tvKey.KEY_WHEELUP: res = "KEY_WHEELUP"; break; case tvKey.KEY_ENTER: res = "KEY_ENTER"; break; case tvKey.KEY_INFO: res = "KEY_INFO"; break; case tvKey.KEY_EXIT: res = "KEY_EXIT"; break; case tvKey.KEY_RETURN: res = "KEY_RETURN"; break; case tvKey.KEY_RED: res = "KEY_RED"; break; case tvKey.KEY_GREEN: res = "KEY_GREEN"; break; case tvKey.KEY_YELLOW: res = "KEY_YELLOW"; break; case tvKey.KEY_BLUE: res = "KEY_BLUE"; break; case tvKey.KEY_INFOLINK: res = "KEY_INFOLINK"; break; case tvKey.KEY_RW: res = "KEY_RW"; break; case tvKey.KEY_PAUSE: res = "KEY_PAUSE"; break; case tvKey.KEY_FF: res = "KEY_FF"; break; case tvKey.KEY_PLAY: res = "KEY_PLAY"; break; case tvKey.KEY_STOP: res = "KEY_STOP"; break; case tvKey.KEY_EMPTY: res = "KEY_EMPTY"; break; case tvKey.KEY_PRECH: res = "KEY_PRECH"; break; case tvKey.KEY_SOURCE: res = "KEY_SOURCE"; break; case tvKey.KEY_CHLIST: res = "KEY_CHLIST"; break; case tvKey.KEY_MENU: res = "KEY_MENU"; break; case tvKey.KEY_WLINK: res = "KEY_WLINK"; break; case tvKey.KEY_CC: res = "KEY_CC"; break; case tvKey.KEY_CONTENT: res = "KEY_CONTENT"; break; case tvKey.KEY_FAVCH: res = "KEY_FAVCH"; break; case tvKey.KEY_REC: res = "KEY_REC"; break; case tvKey.KEY_EMODE: res = "KEY_EMODE"; break; case tvKey.KEY_DMA: res = "KEY_DMA"; break; case tvKey.KEY_VOL_UP: res = "KEY_VOL_UP"; break; case tvKey.KEY_VOL_DOWN: res = "KEY_VOL_DOWN"; break; case tvKey.KEY_PANEL_CH_UP: res = "KEY_PANEL_CH_UP"; break; case tvKey.KEY_PANEL_CH_DOWN: res = "KEY_PANEL_CH_DOWN"; break; case tvKey.KEY_PANEL_VOL_UP: res = "KEY_PANEL_VOL_UP"; break; case tvKey.KEY_PANEL_VOL_DOWN: res = "KEY_PANEL_VOL_DOWN"; break; case tvKey.KEY_PANEL_ENTER: res = "KEY_PANEL_ENTER"; break; case tvKey.KEY_PANEL_RETURN: res = "KEY_PANEL_RETURN"; break; case tvKey.KEY_PANEL_SOURCE: res = "KEY_PANEL_SOURCE"; break; case tvKey.KEY_PANEL_MENU: res = "KEY_PANEL_MENU"; break; case tvKey.KEY_PANEL_POWER: res = "KEY_PANEL_POWER"; break; default: res = "Unknown Key (" + code + ")"; break; } return res; }; Main.tvKeys = { KEY_UP :38, KEY_DOWN :40, KEY_LEFT :37, KEY_RIGHT :39, KEY_ENTER :13, KEY_EXIT :27, KEY_RETURN :27, KEY_STOP :27, // ESC // KEY_MUTE :27, KEY_1 :49, KEY_2 :50, KEY_3 :51, KEY_4 :52, KEY_5 :53, KEY_6 :54, KEY_7 :55, KEY_8 :56, KEY_9 :57, KEY_0 :48, KEY_TOOLS: 116, KEY_RED :82, KEY_GREEN :103, KEY_YELLOW :121, KEY_BLUE :98, // Un-used keycodes KEY_RW :69, KEY_PAUSE :74, KEY_FF :72, KEY_PLAY :71, KEY_STOP :70, KEY_PANEL_CH_UP :104, KEY_PANEL_CH_DOWN :106, KEY_PANEL_VOL_UP :203, KEY_PANEL_VOL_DOWN :204, KEY_PANEL_ENTER :309, KEY_PANEL_SOURCE :612, KEY_PANEL_MENU :613, KEY_PANEL_POWER :614, KEY_POWER :76, KEY_VOL_UP :7, KEY_VOL_DOWN :11, KEY_CH_UP :68, KEY_CH_DOWN :65, KEY_MTS :655, KEY_12 :1057, KEY_AD :1039, KEY_FF_ :1078, KEY_REWIND_ :1080, KEY_SLEEP :1097, KEY_STEP :1023, KEY_HOME :1118 };