From 5064f8b7b35540dc23b74d1f075b082b4d07a604 Mon Sep 17 00:00:00 2001 From: thlo Date: Sun, 3 Mar 2013 21:42:04 +0100 Subject: Version 0.91. Direct Channel Access added for Live and Channel Numbers. Folder Headlines. Cropped Picture Size. --- smarttv-client/Javascript/Data.js | 47 +++++-- smarttv-client/Javascript/DirectAccess.js | 220 ++++++++++++++++++++++++++++++ smarttv-client/Javascript/Display.js | 217 ++++++++++++----------------- smarttv-client/Javascript/Main.js | 108 ++++++++++----- smarttv-client/Javascript/Player.js | 121 +++++++++++++--- smarttv-client/Javascript/Server.js | 3 +- smarttv-client/config.xml | 2 +- smarttv-client/index.html | 13 +- 8 files changed, 535 insertions(+), 196 deletions(-) create mode 100644 smarttv-client/Javascript/DirectAccess.js (limited to 'smarttv-client') diff --git a/smarttv-client/Javascript/Data.js b/smarttv-client/Javascript/Data.js index 1a325f8..112785e 100755 --- a/smarttv-client/Javascript/Data.js +++ b/smarttv-client/Javascript/Data.js @@ -2,6 +2,8 @@ var Data = { assets : new Item, folderList : [], + createAccessMap : false, + directAccessMap : {} }; Array.prototype.remove = function(from, to) { @@ -13,8 +15,8 @@ Array.prototype.remove = function(from, to) { Data.reset = function() { this.assets = null; this.assets = new Item; - this.folderList = []; + this.createAccessMap = false; // this.folderList.push({item : this.assets, id: 0}); Main.log("Data.reset: folderList.push. this.folderList.length= " + this.folderList.length); @@ -25,9 +27,9 @@ Data.completed= function(sort) { this.assets.sortPayload(); this.folderList.push({item : this.assets, id: 0}); - Main.log("Data.completed: folderList.push. this.folderList.length= " + this.folderList.length); - Main.log ("Data.completed()= " +this.folderList.length); - + Main.log("---------- completed ------------"); + Main.log("Data.completed: Data.folderList.length= " + this.folderList.length); + Main.log("Data.completed(): createAccessMap= " + ((this.createAccessMap == true) ? "true": "false")); }; Data.selectFolder = function (idx, first_idx) { @@ -51,6 +53,9 @@ Data.isRootFolder = function() { }; Data.addItem = function(t_list, pyld) { + if (this.createAccessMap == true) { + this.directAccessMap[pyld.num] = []; + } this.assets.addChild(t_list, pyld, 0); }; @@ -60,6 +65,22 @@ Data.dumpFolderStruct = function(){ Main.log("---------- dumpFolderStruct Done -------"); }; +Data.dumpDirectAccessMap = function(){ + Main.log("---------- dumpDirectAccessMap ------------"); + for(var prop in this.directAccessMap) { + var s = ""; + for (var i = 0; i < this.directAccessMap[prop].length; i++) + s = s + "i= " + i + " = " + this.directAccessMap[prop][i] + " "; + Main.log(prop + ": " + s); + } +/* var i = 1; + for (i = 1; i < 20; i++) + Main.log(i + ": " + this.directAccessMap[""+i]); +*/ + Main.log("---------- dumpDirectAccessMap Done -------"); + +}; + Data.findEpgUpdateTime = function() { return this.assets.findEpgUpdateTime(Display.GetEpochTime() + 10000, "", 0); // min, guid, level @@ -114,16 +135,18 @@ Item.prototype.getItem = function (title) { Item.prototype.addChild = function (key, pyld, level) { if (key.length == 1) { + if (Data.createAccessMap == true) { + Data.directAccessMap[pyld.num].push(this.childs.length); + // this.titles.push({title: pyld.startstr + " - " + key , pyld : pyld}); + } var folder = new Item; -// folder.title = pyld.startstr + " - " + key; folder.title = key[0]; folder.payload = pyld; folder.isFolder = false; this.childs.push(folder); -// this.titles.push({title: pyld.startstr + " - " + key , pyld : pyld}); - } + } else { - if (level > 10) { + if (level > 20) { Main.log(" too many levels"); return; } @@ -131,13 +154,19 @@ Item.prototype.addChild = function (key, pyld, level) { var found = false; for (var i = 0; i < this.childs.length; i++) { if (this.childs[i].title == t) { + if (Data.createAccessMap == true) { + Data.directAccessMap[pyld.num].push(i); // should start from 1 + } this.childs[i].addChild(key, pyld, level +1); found = true; - break; + break; } } if (found == false) { var folder = new Item; + if (Data.createAccessMap == true) { + Data.directAccessMap[pyld.num].push(this.childs.length); // should start from 1 + } folder.title = t; folder.addChild(key, pyld, level+1); this.childs.push(folder); diff --git a/smarttv-client/Javascript/DirectAccess.js b/smarttv-client/Javascript/DirectAccess.js new file mode 100644 index 0000000..73d9fdf --- /dev/null +++ b/smarttv-client/Javascript/DirectAccess.js @@ -0,0 +1,220 @@ +DirectAccess = { + created: false, + returnCallback : null, + timeout : 0, + timeoutObj : null, + delay : 1500 +}; + +/* +There is the Data.directAccessMap which contains an array for each channel number + +When I do a direct access, then I first need to "go down to root" and then apply the positions from the array. + +Main.selectedVideo needs to point to the selected video of that current folder + + +*/ + +DirectAccess.selectNewChannel = function (num) { + Main.log("DirectAccess.selectNewChannel: val= (" + num + ")"); + if (!(num in Data.directAccessMap)){ + Main.log("DirectAccess.selectNewChannel: val= (" + num +") not found!"); + Notify.showNotify("Not Found", true); + +/* Player.stopVideo(); + Main.changeState(0); + widgetAPI.blockNavigation(event); +*/ + return; + } + + Main.log("DirectAccess.selectNewChannel num= " + num + " Data.directAccessMap[num]= " +Data.directAccessMap[num] ); + if (Data.isRootFolder() != true) { + var itm = Data.folderUp(); + Main.selectedVideo = itm.id; + } + // now I should be in root + switch(Data.directAccessMap[num].length) { + case 1: + Main.selectedVideo= Data.directAccessMap[num][0]; + Main.log("DirectAccess.selectNewChannel num=" + num +" - Case 1: Main.selectedVideo= "+ Main.selectedVideo); + break; + case 2: + Main.log("DirectAccess.selectNewChannel num=" + num +" - Case 2: Data.directAccessMap[num][0]= "+ Data.directAccessMap[num][0] + " Data.directAccessMap[num][1]= " + Data.directAccessMap[num][1]); + if (Data.getCurrentItem().childs[Data.directAccessMap[num][0]].isFolder == true) { + Data.selectFolder(Data.directAccessMap[num][0], Data.directAccessMap[num][0]); + Main.selectedVideo= Data.directAccessMap[num][1]; + } + else { + // Error: Should be a folder, if there is two elms in directAccessMap + Display.showPopup("directAccess Failed: Inconsistency in directAccessMap"); + Main.log("ERROR in selectNewChannel num=" + num +"- Case 2: Data.directAccessMap[num][0]= "+ Data.directAccessMap[num][0] + " Data.directAccessMap[num][1]= " + Data.directAccessMap[num][1]); + + Player.stopVideo(); + Main.changeState(0); + widgetAPI.blockNavigation(event); + } + break; + default: + Display.showPopup("directAccess Failed: Inconsistency in directAccessMap. More than 2 elms"); + Main.log("ERROR in selectNewChannel num=" + num +" - Data.directAccessMap[num].length= "+ Data.directAccessMap[num].length); + Player.stopVideo(); + Main.changeState(0); + widgetAPI.blockNavigation(event); + + return; + break; + } + + Player.stopVideo(); + Main.playItem(); + + + // +}; + +DirectAccess.init = function (){ + if (this.created == false) { + DirectAccess.createStyleSheet(); + $("#directChanAccess").hide(); + this.created = true; + } +}; + +DirectAccess.show = function () { + $("#directChanAccess").show(); + $("#directAccessAnchor").focus(); + DirectAccess.timeout = Display.GetEpochTime() + (DirectAccess.delay / 1000.0); + DirectAccess.timeoutObj = window.setTimeout( function() {DirectAccess.handleTimeout();}, DirectAccess.delay); + Main.log("DirectAccess.show: now= "+ Display.GetEpochTime() +" timeout= " + DirectAccess.timeout +" delta= " + (DirectAccess.timeout -Display.GetEpochTime())); + }; + + +DirectAccess.hide = function () { + Main.log("DirectAccess.hide: timeout= " + DirectAccess.timeout); + if (DirectAccess.timeoutObj != null) { + window.clearTimeout(DirectAccess.timeoutObj); + DirectAccess.timeoutObj = null; + }; + $("#directAccessAnchor").val(""); + + $("#directChanAccess").hide(); + $("#directAccessAnchor").blur(); + Main.enableKeys(); +}; + +DirectAccess.handleTimeout = function () { + Main.log("DirectAccess.handleTimeout"); + DirectAccess.timeoutObj = null; + if (Display.GetEpochTime() < DirectAccess.timeout) { + var delta = (DirectAccess.timeout -Display.GetEpochTime()) *1000.0; + DirectAccess.timeoutObj = window.setTimeout( DirectAccess.handleTimeout, delta); + DirectAccess.timeout = Display.GetEpochTime() + (delta / 1000.0); + Main.log("DirectAccess.timeout: " + DirectAccess.timeout); + } + else { + Main.log("DirectAccess.timeout: handleEnter"); + DirectAccess.handleEnter(); + }; +}; + +DirectAccess.extendTimer = function () { + DirectAccess.timeout = Display.GetEpochTime() + (DirectAccess.delay / 1000.0); + Main.log("DirectAccess.extendTimer: " + DirectAccess.timeout); +}; + +DirectAccess.cancel = function () { + DirectAccess.hide(); +}; + +DirectAccess.handleEnter = function () { + Main.log("DirectAccess.handleEnter val= " +$("#directAccessAnchor").val() ); + DirectAccess.selectNewChannel($("#directAccessAnchor").val()); + DirectAccess.hide(); + + // find entry according to number +}; + +DirectAccess.createStyleSheet = function () { + var sheet = $("