diff --git a/dashboard-ui/components/remotecontrolautoplay.js b/dashboard-ui/components/remotecontrolautoplay.js new file mode 100644 index 0000000000..6689ea3005 --- /dev/null +++ b/dashboard-ui/components/remotecontrolautoplay.js @@ -0,0 +1,51 @@ +(function () { + + function transferPlayback(oldPlayer) { + + oldPlayer.getPlayerState().then(function (state) { + + var item = state.NowPlayingItem; + + if (!item) { + return; + } + + var playState = state.PlayState || {}; + + oldPlayer.stop(); + + var itemId = item.Id; + var resumePositionTicks = playState.PositionTicks || 0; + + MediaController.play({ + ids: [itemId], + startPositionTicks: resumePositionTicks + }); + + }); + } + + Events.on(MediaController, 'playerchange', function (e, newPlayer, newTarget, oldPlayer) { + + if (!oldPlayer) { + console.log('Skipping remote control autoplay because oldPlayer is null'); + return; + } + + if (!oldPlayer.isLocalPlayer) { + console.log('Skipping remote control autoplay because oldPlayer is not a local player'); + return; + } + + if (newPlayer.isLocalPlayer) { + console.log('Skipping remote control autoplay because newPlayer is a local player'); + return; + } + + // If playback is playing locally and a new player is activated, transfer the media to that player + if (oldPlayer.isPlaying()) { + transferPlayback(oldPlayer); + } + }); + +})(); \ No newline at end of file diff --git a/dashboard-ui/scripts/chromecast.js b/dashboard-ui/scripts/chromecast.js index d9f8aa6e99..a281ec02d7 100644 --- a/dashboard-ui/scripts/chromecast.js +++ b/dashboard-ui/scripts/chromecast.js @@ -1,6 +1,31 @@ (function (window, chrome, console) { // Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js + var currentResolve; + var currentReject; + + var PlayerName = 'Chromecast'; + + function sendConnectionResult(isOk) { + + var resolve = currentResolve; + var reject = currentReject; + + currentResolve = null; + currentReject = null; + + if (isOk) { + if (resolve) { + resolve(); + } + } else { + if (reject) { + reject(); + } else { + MediaController.removeActivePlayer(PlayerName); + } + } + } /** * Constants of states for Chromecast device @@ -26,8 +51,6 @@ 'ERROR': 'ERROR' }; - var PlayerName = 'Chromecast'; - var applicationID = "2D4B1DA3"; var messageNamespace = 'urn:x-cast:com.connectsdk'; @@ -191,7 +214,7 @@ console.log('sessionUpdateListener: setting currentMediaSession to null'); this.currentMediaSession = null; - MediaController.removeActivePlayer(PlayerName); + sendConnectionResult(false); } }; @@ -257,7 +280,7 @@ //}); - MediaController.removeActivePlayer(PlayerName); + sendConnectionResult(false); }; /** @@ -485,7 +508,11 @@ Events.on(castPlayer, "connect", function (e) { - MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo()); + if (currentResolve) { + sendConnectionResult(true); + } else { + MediaController.setActivePlayer(PlayerName, self.getCurrentTargetInfo()); + } console.log('cc: connect'); // Reset this so the next query doesn't make it appear like content is playing. @@ -832,7 +859,19 @@ self.tryPair = function (target) { return new Promise(function (resolve, reject) { - resolve(); + if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) { + + currentResolve = resolve; + currentReject = reject; + + castPlayer.launchApp(); + } else { + + currentResolve = null; + currentReject = null; + + reject(); + } }); }; } @@ -842,14 +881,6 @@ castPlayer = new CastPlayer(); MediaController.registerPlayer(new chromecastPlayer()); - - Events.on(MediaController, 'playerchange', function (e, newPlayer, newTarget) { - if (newPlayer.name == PlayerName) { - if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) { - castPlayer.launchApp(); - } - } - }); } requirejs(["https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"], initializeChromecast); diff --git a/dashboard-ui/scripts/mediacontroller.js b/dashboard-ui/scripts/mediacontroller.js index 18b80eab6b..709537c2df 100644 --- a/dashboard-ui/scripts/mediacontroller.js +++ b/dashboard-ui/scripts/mediacontroller.js @@ -286,9 +286,9 @@ }; }; - function triggerPlayerChange(newPlayer, newTarget) { + function triggerPlayerChange(newPlayer, newTarget, previousPlayer) { - Events.trigger(self, 'playerchange', [newPlayer, newTarget]); + Events.trigger(self, 'playerchange', [newPlayer, newTarget, previousPlayer]); } self.setActivePlayer = function (player, targetInfo) { @@ -303,13 +303,15 @@ throw new Error('null player'); } + var previousPlayer = currentPlayer; + currentPairingId = null; currentPlayer = player; currentTargetInfo = targetInfo; console.log('Active player: ' + JSON.stringify(currentTargetInfo)); - triggerPlayerChange(player, targetInfo); + triggerPlayerChange(player, targetInfo, previousPlayer); }; var currentPairingId = null; @@ -333,12 +335,14 @@ player.tryPair(targetInfo).then(function () { + var previousPlayer = currentPlayer; + currentPlayer = player; currentTargetInfo = targetInfo; console.log('Active player: ' + JSON.stringify(currentTargetInfo)); - triggerPlayerChange(player, targetInfo); + triggerPlayerChange(player, targetInfo, previousPlayer); }); }; diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 29ef578e55..c5115dd4d3 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -2267,6 +2267,8 @@ var AppInfo = {}; postInitDependencies.push('cordova/ios/tabbar'); } + postInitDependencies.push('components/remotecontrolautoplay'); + require(postInitDependencies); }); }