2 * Copyright (c) 2013, Intel Corporation.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
10 var currentMenu = "main";
12 var resizeCB = resizeMainMenu;
15 var screenOrientation;
18 var contentType = "AUDIO";
24 var currentPlayerType = "AUDIO";
25 var currentPlayerControls;
31 var vidIcon = new Image();
32 var imgIcon = new Image();
33 var musicIcon = new Image();
34 var imagesLoaded = false;
38 var loadAndPlay = false;
40 var currentFileLoaded = false;
44 var nightMode = false;
45 var waitingToResumeVideo = false; //Media has been paused by exterior forces. If set to true, resume previous media when given the signal.
47 var mainMenuTitleTemplateLandscape = {"font" : "oblique bolder 30pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
48 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
50 var mainMenuTitleTemplate = {"font" : "oblique bolder 40pt arial", "lineWidth" : 9.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
51 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.4)"};
53 var mainTrackTemplateLandscape = {"font" : "bold 20pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
54 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
56 var mainTrackTemplate = {"font" : "bold 30pt Arial", "lineWidth" : 7.5, "fillStyle" : "black", "strokeStyle" : "white", "textAlign" : "left",
57 "largeShadow" : 8, "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 45, "shadowColor" : "rgba(255, 187, 0, 0.5))"};
59 var mediaTextTemplate2 = {"font" : "bold 20pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
60 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
62 var mediaTextTemplate3 = {"font" : "bold 20pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
64 var trackTextTemplate = {"font" : "bold 16pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
66 var mediaTextTemplate2Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 10.0, "fillStyle" : "white", "strokeStyle" : "rgba(0, 0, 0, 1.0)", "textAlign" : "left",
67 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 0, "shadowColor" : "rgba(0, 0, 0, 1.0)"};
69 var mediaTextTemplate3Landscape = {"font" : "bold 15pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "rgba(100, 0, 0, 1.0)", "textAlign" : "left"};
71 var trackTextTemplateLandscape = {"font" : "bold 11pt Arial", "lineWidth" : 3.0, "fillStyle" : "white", "strokeStyle" : "black", "textAlign" : "left"};
74 var mediaTextTemplate = {"font" : "bold 20pt Arial", "fillStyle" : "", "textAlign" : "left",
75 "shadowOffsetX" : 0, "shadowOffsetY" : 0, "shadowBlur" : 12, "shadowColor" : "red"};
79 console.log("Content discovery failed");
82 function setupSpeech()
84 console.log("MediaPlayer in setupSpeech");
86 speechObj = tizen.speech;
87 speechObj.vocalizeString(" ");
91 var speechEventListener = {
92 onaudiostart: function(){console.log("MediaPlayer: onaudiostart received");},
93 onsoundstart: function(){console.log("MediaPlayer: onsoundstart received");},
94 onspeechstart: function(){console.log("MediaPlayer: onspeechstart received");},
95 onspeechend: function(){console.log("MediaPlayer: onspeechend received");},
96 onsoundend: function(){console.log("MediaPlayer: onsoundend received");},
97 onaudioend: function(){console.log("MediaPlayer: onaudioend received");},
98 onresult: function(result){
100 console.log("MediaPlayer: onresult received");
102 for (var i = 0; i < result.length; i++)
104 console.log("MediaPlayer: forloop, command = " + result[i]);
105 var commandFound = false;
134 onnomatch: function(result){console.log("MediaPlayer: onnomatch received ");},
135 onerror: function(error){console.log("MediaPlayer: onerror received");},
136 onstart: function(){console.log("MediaPlayer: onstart received");},
137 onend: function(){console.log("MediaPlayer: onend received");}
140 speechObj.setCBListener(speechEventListener);
145 console.log("MediaPlayer setupSpeech FAILED + " + err.message);
150 function loadImages(callback)
152 console.log("MediaPlayer in loadImages");
154 var loadedImages = 0;
157 for (var src in audioContent)
161 for (var src in audioContent)
165 audioContent[src].coverArt = new Image();
166 audioContent[src].coverArt.onload = function(){
168 if (++loadedImages >= numImages) {
170 callback(audioContent);
174 audioContent[src].coverArt.onerror = function(e){
175 audioContent[src].coverArt.src = "images/musicIcon.png";
178 audioContent[src].coverArt.src = (audioContent[src].coverArtURI !== undefined && audioContent[src].coverArtURI !== "") ? audioContent[src].coverArtURI : "images/musicIcon.png";
182 console.log("Failed to load audio cover image");
187 function updateMediaName(newArtist, newTitle, newCover)
189 console.log("MediaPlayer in updateMediaName");
191 var playBarHeight = mediaNameCanvas.height;
192 var boxWidth = playBarHeight * 0.75;
193 mediaNameCTX.clearRect(0,0,mediaNameCanvas.width, mediaNameCanvas.height);
195 if (currentPlayerType === "AUDIO")
198 var alphaJump = 0.01;
202 mediaNameCTX.fillStyle="rgba(30,30,30,0.5)";
203 mediaNameCTX.strokeStyle="rgba(130,130,130,1)";
204 mediaNameCTX.lineWidth = 5;
205 mediaNameCTX.fillRect(0,0,mediaNameCanvas.width, playBarHeight);
206 mediaNameCTX.strokeRect(-20,0,mediaNameCanvas.width + 40, playBarHeight);
208 if (newCover === undefined || newCover.naturalWidth === undefined || newCover.naturalWidth <= 0)
210 newCover = musicIcon;
213 mediaNameCTX.drawImage(newCover, 20, (playBarHeight - boxWidth) / 2, boxWidth, boxWidth);
215 if (screenOrientation === "portrait")
217 var textStartX = boxWidth + 50;
218 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 70 , "zLoc" : 0,
219 "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
220 trackText.applyTemplate(mainMenuTitleTemplate);
221 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 70 + trackText.height, "zLoc" : 0,
222 "width" : mediaNameCanvas.width - textStartX, "height" : 50, "lineHeight" : 50, "wordWrap" : true});
223 artistText.applyTemplate(mainTrackTemplate);
224 artistText.yLoc = 70 + trackText.height;
228 var textStartX = boxWidth + 50;
229 var trackText = new TextObject(mediaNameCTX,{"text" : newTitle, "xLoc" : textStartX, "yLoc" : 50 , "zLoc" : 0,
230 "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
231 trackText.applyTemplate(mainMenuTitleTemplateLandscape);
232 var artistText = new TextObject(mediaNameCTX,{"text" : newArtist, "xLoc" : textStartX, "yLoc" : 50, "zLoc" : 0,
233 "width" : mediaNameCanvas.width - textStartX, "height" : 30, "lineHeight" : 30, "wordWrap" : true});
234 artistText.applyTemplate(mainTrackTemplateLandscape);
235 artistText.yLoc = 50 + trackText.height;
239 trackText.drawLargeShadow();
240 artistText.drawObj();
245 function fillMediaList(contentList)
247 console.log("MediaPlayer in fillMediaList");
248 //Don't try and fill an empty content list or an audio list that hasn't finished loading the thumbnails
249 if (contentList === undefined || contentList === null || contentList.length <=0 || (contentList === audioContent && !imagesLoaded))
254 var iconImg = new Image();
255 var canvasW = mediaListItemW;
256 var canvasH = mediaListItemH * 0.95 ;
258 $("#mediaListItems").empty();
259 var lightColor = false;
260 for (var i=0; i < contentList.length; i++)
266 $("#mediaListItems").append("<li><a href='#' class='night'>" +
267 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
273 $("#mediaListItems").append("<li><a href='#'>" +
274 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
283 $("#mediaListItems").append("<li><a href='#' class='lightColor night'>" +
284 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
290 $("#mediaListItems").append("<li><a href='#' class='lightColor'>" +
291 "<canvas id=canvasNum" + i + " width=" + canvasW + " height=" + canvasH + "> </canvas>" +
298 lightColor = !lightColor;
300 currentCanvas = document.getElementById("canvasNum"+ i);
301 currentCTX = currentCanvas.getContext("2d");
303 // Set callback function for the new list item
304 $("#canvasNum"+i).click(function () {
305 listIndex = $(this).parent().parent().index();
307 switch (currentPlayerType)
312 $("#playButton").toggleClass('playing', false);
314 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
315 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
321 console.log("updateMediaName error: " + err.message);
328 $("#playButton").toggleClass('playing', false);
329 updateMediaName(videoContent[listIndex].artists[0], audioContent[listIndex].title, vidIcon);
330 $("#videoSrc").attr("src", videoContent[listIndex].contentURI);
332 $("#mediaList").fadeOut(300);
336 console.log("updateMediaName error: " + err.message);
343 $("#playButton").toggleClass('playing', false);
344 $("#imagePlayer").css("background", "url(" + imageContent[listIndex].contentURI + ") no-repeat center");
345 $("#imagePlayer").css("background-size", "contain");
346 $("#mediaList").fadeOut(300);
350 console.log("updateMediaName error: " + err.message);
359 switch (currentPlayerType)
362 currentCTX.drawImage(audioContent[i].coverArt, 0, 0, canvasH, canvasH );
363 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
364 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
368 currentCTX.drawImage(vidIcon, 0, 0, canvasH, canvasH );
369 var artistText = new TextObject(currentCTX,{"text" : contentList[i].artists[0], "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
370 var trackText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
374 currentCTX.drawImage(imgIcon, 0, 0, canvasH, canvasH );
375 var artistText = new TextObject(currentCTX,{"text" : contentList[i].title, "xLoc" : canvasH + 20, "yLoc" : canvasH / 2.5 , "zLoc" : 0});
376 var trackText = new TextObject(currentCTX,{"text" : " ", "xLoc" : canvasH + 20, "yLoc" : canvasH / 1.1 , "zLoc" : 0});
383 var mediaTextTemp1 = screenOrientation === "portrait" ? mediaTextTemplate2 : mediaTextTemplate2Landscape;
384 var mediaTextTemp2 = screenOrientation === "portrait" ? mediaTextTemplate3 : mediaTextTemplate3Landscape;
385 var trackTextTemp = screenOrientation === "portrait" ? trackTextTemplate : trackTextTemplateLandscape;
387 trackText.applyTemplate(mediaTextTemp1);
389 trackText.applyTemplate(mediaTextTemp2);
392 artistText.applyTemplate(trackTextTemp);
393 artistText.drawObj();
396 $("#mediaListItems li").css({"width" : mediaListItemW + "px", "height" : mediaListItemH + "px", "margin-bottom" : "10px"});
399 function onContentItemArraySuccess(content)
401 console.log("MediaPlayer in onContentItemArraySuccess");
402 var emptyContent = true;
404 if (!content || content === undefined || content.length <= 0)
405 console.log("Invalid content for " + contentType);
408 emptyContent = false;
419 audioContent = content;
420 sortByAlpha(audioContent);
422 $("#audioSrc").attr("src", audioContent[0].contentURI);
427 for (var i = 0; i < audioContent.length; i++)
429 var iconURI = (audioContent[i].thumbnailURIs !== undefined && audioContent[i].thumbnailURIs !== null) ? audioContent[i].thumbnailURIs[0] : "images/musicIcon.png";
430 audioContent[i].coverArtURI = iconURI;
433 loadImages(fillMediaList);
438 console.log("Error when parsing audioContent");
442 contentType = "VIDEO";
448 videoContent = content;
449 $("#videoSrc").attr("src", videoContent[0].contentURI);
451 contentType = "IMAGE";
457 imageContent = content;
458 $("#imagePlayer").css("background", "url(" + imageContent[0].contentURI + ") no-repeat center");
459 $("#imagePlayer").css("background-size", "contain");
461 contentType = undefined;
465 console.log("Undefined content search type");
466 nextContentType = undefined;
470 if (contentType !== undefined)
471 getMedia(contentType);
474 function getMedia(mediaType)
476 console.log("MediaPlayer in getMedia");
477 var manager = tizen.content;
479 var filter = new tizen.AttributeFilter("type", "EXACTLY", mediaType);
480 manager.find(onContentItemArraySuccess, onError, null, filter);
483 function showMediaMenu()
485 console.log("MediaPlayer in showMediaMenu");
486 $(".navButton").fadeIn(800);
488 switch(currentPlayerType)
494 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
498 console.log("updateMediaName failed for showMediaMenu (audio) : " + err.message);
501 $("#mediaName").fadeIn(800);
502 $(".sortButton").fadeIn(800);
503 currentPlayer.fadeIn(800);
505 $("#mediaList").addClass("mediaListAudioList");
507 if (screenOrientation === "landscape" )
508 $("#mediaList").addClass("landscape");
510 $("#mediaList").removeClass("landscape");
512 $("#mediaList").fadeIn(800);
517 setTimeout(function(){currentPlayer.show()}, 800); //The video element can't be faded, so wait a moment before showing
522 currentPlayer.fadeIn(800);
526 console.log("Invalid player type");
531 function showMediaList()
533 console.log("MediaPlayer in showMediaList");
534 if ($("#mediaList").is(":visible"))
535 $("#mediaList").fadeOut(300);
538 fillMediaList(currentContent);
539 $("#mediaList").fadeIn(300);
543 function changeMenu(menuButtonId)
545 console.log("MediaPlayer in changeMenu");
546 var clickedButton = $("#" + menuButtonId);
547 var buttonWidth = clickedButton.width();
548 var buttonHeight = clickedButton.height();
549 var buttonBottom = clickedButton.css("bottom");
550 var buttonRight = clickedButton.css("right");
552 //Animate the clicked button slightly
553 clickedButton.animate({
554 bottom: screenOrientation === "portrait" ? "+=0" : "+=50",
555 right: screenOrientation === "portrait" ? "+=50" : "+=0",
559 //Reset the size once done
561 clickedButton.width(buttonWidth);
562 clickedButton.height(buttonHeight);
564 if (screenOrientation === "portrait")
565 clickedButton.css({"right": buttonRight});
567 clickedButton.css({"bottom": buttonBottom});
571 $(".mainButton").fadeOut(300);
575 case ("mainMusicButton"):
576 speechObj.vocalizeString("Music player");
577 currentMenu = "audio";
578 currentPlayer = $("#audioPlayer");
579 currentPlayerControls = document.getElementById("audioPlayer");
580 currentPlayerType = "AUDIO";
581 currentContent = audioContent;
585 case ("mainVideoButton"):
586 speechObj.vocalizeString("Video player");
587 currentMenu = "video";
588 currentPlayer = $("#videoPlayer");
589 currentPlayerControls = document.getElementById("videoPlayer");
590 currentPlayerType = "VIDEO";
591 currentContent = videoContent;
595 case ("mainImageButton"):
596 speechObj.vocalizeString("Picture viewer");
597 currentMenu = "image";
598 currentPlayer = $("#imagePlayer");
599 currentPlayerControls = imageControls;
600 currentPlayerType = "IMAGE";
601 currentContent = imageContent;
605 console.log("Error: No menu by that name");
610 function showMainMenu()
612 console.log("MediaPlayer in showMainMenu");
613 currentMenu = "main";
614 currentPlayerControls.pause();
616 $("#playButton").toggleClass('playing', false);
618 //If the media list is showing, hide it. Remove the mediaListAudioList class if it exists so that it will resize properly
619 if ($("#mediaList").is(":visible"))
620 $("#mediaList").fadeOut(300, function(){$("#mediaList").removeClass("mediaListAudioList");});
622 $(".navButton").fadeOut(300);
623 $(".sortButton").fadeOut(300);
624 $("#mediaName").fadeOut(300);
626 if (currentPlayerType !== "VIDEO")
627 currentPlayer.fadeOut(300);
629 currentPlayer.hide();
632 $(".mainButton").css({"opacity": "100"});
633 $(".mainButton").fadeIn(800);
636 function sortByAlpha(contentToSort)
638 console.log("MediaPlayer in sortByAlpha");
639 //If contentToSort is undefined it's because the request came from the sortBy buttons
640 if (contentToSort === undefined)
641 contentToSort = audioContent;
643 contentToSort.sort(function (a,b) {
644 var first = a.title.toLowerCase();
645 var second = b.title.toLowerCase();
655 fillMediaList(contentToSort);
658 function sortByArtist(contentToSort)
660 console.log("MediaPlayer in sortByArtist");
661 if (contentToSort === undefined)
662 contentToSort = audioContent;
664 contentToSort.sort(function (a,b) {
665 var first = a.artists[0].toLowerCase();
666 var second = b.artists[0].toLowerCase();
676 fillMediaList(contentToSort);
679 function sortByAlbum(contentToSort)
681 console.log("MediaPlayer in sortByAlbum");
682 if (contentToSort === undefined)
683 contentToSort = audioContent;
685 contentToSort.sort(function (a,b) {
686 var first = a.album.toLowerCase();
687 var second = b.album.toLowerCase();
697 fillMediaList(contentToSort);
700 /**************************************** NAVIGATION FUNCTIONS *******************************************/
703 // A timer that will produce an error if a file can't be loaded.
704 function startLoadTimer()
706 console.log("MediaPlayer in startLoadTimer");
707 if (loadTimer !== undefined)
708 clearTimeout(loadTimer);
710 loadTimer = setTimeout(
712 if (currentMenu != "main")
714 $("#playButton").toggleClass('playing', false);
715 alert("File failed to load! - " + audioContent[listIndex].artists[0] + " : " + audioContent[listIndex].title);
716 currentFileLoaded = false;
720 // This function is called once a file being loaded is ready to play
721 function playLoadedMedia()
723 console.log("MediaPlayer in playLoadedMedia");
724 currentFileLoaded = true;
726 if (loadTimer !== undefined)
727 clearTimeout(loadTimer);
731 currentPlayerControls.play();
733 $("#playButton").toggleClass('playing', true);
738 function playButtonClick()
740 console.log("MediaPlayer in playButtonClick");
741 if (currentFileLoaded)
743 if (currentPlayerControls.paused)
745 $("#playButton").toggleClass('playing', true);
746 currentPlayerControls.play();
750 $("#playButton").toggleClass('playing', false);
751 currentPlayerControls.pause();
755 alert(audioContent[listIndex].artists[0] + " : " + audioContent[listIndex].title + " failed to load, please select another file");
758 function pauseButtonClick()
760 console.log("MediaPlayer in pauseButtonClick");
761 if (!currentPlayerControls.paused)
763 currentPlayerControls.pause();
764 $("#playButton").toggleClass('playing', false);
768 function backButtonClick()
770 console.log("MediaPlayer in backButtonClick");
771 switch (currentPlayerType)
779 listIndex = imageContent.length - 1;
784 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
785 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
797 videoIndex = imageContent.length - 1;
799 if ($("#mediaList").is(":visible"))
802 $("#playButton").toggleClass('playing', true);
803 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
814 imageIndex = imageContent.length - 1;
816 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
817 $("#imagePlayer").css("background-size", "contain");
822 console.log("Content failure");
828 function nextButtonClick()
830 console.log("MediaPlayer in nextButtonClick");
831 switch (currentPlayerType)
836 if (audioContent.length > (listIndex + 1))
844 $("#audioSrc").attr("src", audioContent[listIndex].contentURI);
845 updateMediaName(audioContent[listIndex].artists[0], audioContent[listIndex].title, audioContent[listIndex].coverArt);
854 if (videoContent.length > (videoIndex + 1))
860 $("#playButton").toggleClass('playing', true);
861 $("#videoSrc").attr("src", videoContent[videoIndex].contentURI);
869 if (imageContent.length > (imageIndex + 1))
874 $("#imagePlayer").css("background", "url(" + imageContent[imageIndex].contentURI + ") no-repeat center");
875 $("#imagePlayer").css("background-size", "contain");
880 console.log("Content failure");
885 /**************************************** END NAVIGATION FUNCTIONS *******************************************/
887 function resizeMainMenu()
889 console.log("MediaPlayer in resizeMainMenu");
891 $("#mediaList").fadeOut(0);
892 screenWidth = window.innerWidth;
893 screenHeight = window.innerHeight;
894 screenOrientation = screenWidth < screenHeight ? "portrait" : "landscape";
895 iconWidth = screenOrientation === "portrait" ? screenHeight / 4 : screenWidth / 4;
898 $(".mainButton").width(iconWidth + "px");
899 $(".mainButton").height(iconWidth + "px");
901 var iconsTop = screenOrientation === "portrait" ? ((screenHeight - (iconWidth * 3)) / 2) - (padding * 3) : (screenHeight - iconWidth) / 2;
903 if (screenOrientation === "portrait")
904 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : (screenWidth / 2) - (iconWidth /2) - padding + "px", "width" : "50%"});
907 $("#mainMenuButtons").css({"top": iconsTop + "px", "left" : ((iconWidth / 2) - (padding * 3)) + "px", "width" : "100%"});
908 $("#sortButtons").addClass("landscape");
912 function resizePlayerPage()
914 console.log("MediaPlayer in resizePlayerPage");
916 audioPlayer = document.getElementById("audioPlayer");
917 videoPlayer = document.getElementById("videoPlayer");
918 screenWidth = window.innerWidth;
919 screenHeight = window.innerHeight;
922 var buttonWidth = screenOrientation === "portrait" ? screenHeight * 0.05 : screenWidth * 0.05;
924 $("#backButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) - (buttonWidth *3)) + "px"});
925 $("#nextButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": ((screenWidth / 2) + (buttonWidth *2)) + "px"});
926 $("#returnButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": padding + "px"});
927 $("#listButton").css({"width": buttonWidth + "px", "height": buttonWidth + "px", "top": padding + "px", "left": (screenWidth - buttonWidth - padding * 2) + "px"});
928 $("#playButton").css({"width": buttonWidth * 1.3 + "px", "height": buttonWidth * 1.3 + "px", "top": padding * 0.3 + "px", "left": (screenWidth / 2) - (buttonWidth / 2) + "px"});
930 mediaNameCanvas.width = (screenWidth);
931 mediaNameCanvas.height = (screenHeight * 0.34) - (buttonWidth + (2 * padding));
932 mediaNameCanvas.style.top = (buttonWidth + (2 * padding) ) + "px";
933 mediaNameCanvas.style.left = "0px";
935 var sortButtonTop = (buttonWidth + (2 * padding) ) + mediaNameCanvas.height - (buttonWidth * 1.3);
936 var sortButtonWidth = buttonWidth * 2.5;
937 var buttonSpacing = screenWidth / 5;
939 mediaListItemW = $("#mediaList").width() * 0.92;
940 mediaListItemH = $("#mediaList").height() / 10;
945 console.log("MediaPlayer in resizeAll");
951 * swipe - Handles swipe events. Currently it just acts as another way to hit the next / back buttons, but
952 * it could be expanded to other things in the future.
955 function swipe(direction, object)
957 console.log("MediaPlayer in swipe");
961 if (direction === "right")
963 else if (direction === "left")
974 console.log("MediaPlayer in init");
975 var vehicle = tizen.vehicle;
978 /* Subscribe to AMB NightMode signal, and switch colors
979 * upon receipt of the signal
982 vehicle.subscribe("NightMode",function(value) {
983 console.log("MediaPlayer: Day / Night mode changed to " + value.nightmode);
985 if (nightMode !== value.nightmode)
987 Array.prototype.forEach.call (document.querySelectorAll ('*'), function (el) {el.classList.toggle('night');});
988 nightMode = value.nightmode
992 /* Subscribe to AMB DrivingMode signal, and pause video
993 * upon receipt of the signal
997 vehicle.subscribe("DrivingMode",function(value) {
998 console.log("MediaPlayer: DrivingMode changed to " + value.drivingMode);
1000 if (value.vehicleSpeed > 0 && currentPlayerType === "VIDEO" && !currentPlayerControls.paused)
1002 console.log("MediaPlayer: pausing video due to vehicle motion");
1003 currentPlayerControls.pause();
1004 waitingToResumeVideo = true;
1006 else if (value.vehicleSpeed === 0 && currentPlayerType === "VIDEO" && waitingToResumeVideo)
1008 console.log("MediaPlayer: vehicle has stopped, resuming video");
1009 currentPlayerControls.play();
1010 waitingToResumeVideo = false;
1016 musicIcon.src = "images/musicIcon.png";
1017 vidIcon.src = "images/videoIcon.png";
1018 imgIcon.src = "images/imageIcon.png";
1019 imageControls = new ImageControls();
1021 mediaNameCanvas = document.getElementById("mediaName");
1022 mediaNameCTX = mediaNameCanvas.getContext("2d");
1024 //Resize all items and search for local media
1027 //Check if DLNA plugin is installed. If so, scan for media.
1028 if (tizen.mediaserver)
1030 tizen.mediaserver.scanNetwork(foundMediaServer);
1033 console.log("MediaPlayer: No DLNA server running, using local media only...");
1035 //Setup voice control
1039 console.log("MediaPlayer: Speech Recognition not running, voice control will be unavailable");
1042 getMedia(contentType);
1044 //Prevent highlighting
1045 window.ondragstart = function() { return false; }
1047 $(window).bind('resize', resizeAll);
1049 //Simple swipe detection
1050 $("#mediaName").mousedown(function(e){mouseDownEvent = e;});
1051 $("#mediaName").mouseup(function(e){
1052 if (Math.abs(mouseDownEvent.clientY - e.clientY) < 100)
1054 if (Math.abs(mouseDownEvent.clientX - e.clientX) > 100)
1056 if (mouseDownEvent.clientX > e.clientX)
1057 swipe("left", "mediaName");
1059 swipe("right", "mediaName");
1064 document.getElementById('videoPlayer').addEventListener("playing", function() {
1065 $("#navigationButtons").hide();
1067 document.getElementById('videoPlayer').addEventListener("pause", function() {
1068 $("#navigationButtons").show();
1072 $(document).ready(function () {