From dc55f38e26588167fbec89a9779e79a3c5cda11f Mon Sep 17 00:00:00 2001 From: Shih-Chiang Chien Date: Mon, 9 Nov 2015 17:56:59 +0800 Subject: [PATCH] Bug 1222907 - report media status to MediaCastingBar. r=mfinkle. --- mobile/android/base/ChromeCast.java | 22 ++++++++++----- mobile/android/base/MediaCastingBar.java | 10 +++++++ mobile/android/chrome/content/CastingApps.js | 12 +++++++-- mobile/android/modules/MediaPlayerApp.jsm | 28 ++++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/mobile/android/base/ChromeCast.java b/mobile/android/base/ChromeCast.java index 9eaa084870c4..1db13d057afe 100644 --- a/mobile/android/base/ChromeCast.java +++ b/mobile/android/base/ChromeCast.java @@ -86,13 +86,23 @@ class ChromeCast implements GeckoMediaPlayer { @Override public void onStatusUpdated() { MediaStatus mediaStatus = remoteMediaPlayer.getMediaStatus(); - boolean isPlaying = mediaStatus.getPlayerState() == MediaStatus.PLAYER_STATE_PLAYING; - // TODO: Do we want to shutdown when there are errors? - if (mediaStatus.getPlayerState() == MediaStatus.PLAYER_STATE_IDLE && - mediaStatus.getIdleReason() == MediaStatus.IDLE_REASON_FINISHED) { - - GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Casting:Stop", null)); + switch (mediaStatus.getPlayerState()) { + case MediaStatus.PLAYER_STATE_PLAYING: + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("MediaPlayer:Playing", null)); + break; + case MediaStatus.PLAYER_STATE_PAUSED: + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("MediaPlayer:Paused", null)); + break; + case MediaStatus.PLAYER_STATE_IDLE: + // TODO: Do we want to shutdown when there are errors? + if (mediaStatus.getIdleReason() == MediaStatus.IDLE_REASON_FINISHED) { + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Casting:Stop", null)); + } + break; + default: + // TODO: Do we need to handle other status such as buffering / unknown? + break; } } diff --git a/mobile/android/base/MediaCastingBar.java b/mobile/android/base/MediaCastingBar.java index 496075bc0d45..0dbfbb4e2466 100644 --- a/mobile/android/base/MediaCastingBar.java +++ b/mobile/android/base/MediaCastingBar.java @@ -34,6 +34,8 @@ public class MediaCastingBar extends RelativeLayout implements View.OnClickListe EventDispatcher.getInstance().registerGeckoThreadListener(this, "Casting:Started", + "Casting:Paused", + "Casting:Playing", "Casting:Stopped"); } @@ -71,6 +73,8 @@ public class MediaCastingBar extends RelativeLayout implements View.OnClickListe public void onDestroy() { EventDispatcher.getInstance().unregisterGeckoThreadListener(this, "Casting:Started", + "Casting:Paused", + "Casting:Playing", "Casting:Stopped"); } @@ -111,6 +115,12 @@ public class MediaCastingBar extends RelativeLayout implements View.OnClickListe } mMediaPlay.setVisibility(GONE); mMediaPause.setVisibility(VISIBLE); + } else if (event.equals("Casting:Paused")) { + mMediaPause.setVisibility(GONE); + mMediaPlay.setVisibility(VISIBLE); + } else if (event.equals("Casting:Playing")) { + mMediaPlay.setVisibility(GONE); + mMediaPause.setVisibility(VISIBLE); } else if (event.equals("Casting:Stopped")) { hide(); } diff --git a/mobile/android/chrome/content/CastingApps.js b/mobile/android/chrome/content/CastingApps.js index 4d8177823e36..5e83d5eff561 100644 --- a/mobile/android/chrome/content/CastingApps.js +++ b/mobile/android/chrome/content/CastingApps.js @@ -745,8 +745,16 @@ var CastingApps = { } let status = aRemoteMedia.status; - if (status == "completed") { - this.closeExternal(); + switch (status) { + case "started": + Messaging.sendRequest({ type: "Casting:Playing" }); + break; + case "paused": + Messaging.sendRequest({ type: "Casting:Paused" }); + break; + case "completed": + this.closeExternal(); + break; } } }; diff --git a/mobile/android/modules/MediaPlayerApp.jsm b/mobile/android/modules/MediaPlayerApp.jsm index 7bfc6ed181e3..949863d1f32f 100644 --- a/mobile/android/modules/MediaPlayerApp.jsm +++ b/mobile/android/modules/MediaPlayerApp.jsm @@ -83,6 +83,9 @@ function RemoteMedia(id, listener) { RemoteMedia.prototype = { shutdown: function shutdown() { + Services.obs.removeObserver(this, "MediaPlayer:Playing"); + Services.obs.removeObserver(this, "MediaPlayer:Paused"); + this._send("MediaPlayer:End", {}, (result, err) => { this._status = "shutdown"; if ("onRemoteMediaStop" in this._listener) { @@ -123,6 +126,8 @@ RemoteMedia.prototype = { return; } + Services.obs.addObserver(this, "MediaPlayer:Playing", false); + Services.obs.addObserver(this, "MediaPlayer:Paused", false); this._status = "started"; }) }, @@ -131,6 +136,29 @@ RemoteMedia.prototype = { return this._status; }, + observe: function (aSubject, aTopic, aData) { + switch (aTopic) { + case "MediaPlayer:Playing": + if (this._status !== "started") { + this._status = "started"; + if ("onRemoteMediaStatus" in this._listener) { + this._listener.onRemoteMediaStatus(this); + } + } + break; + case "MediaPlayer:Paused": + if (this._status !== "paused") { + this._status = "paused"; + if ("onRemoteMediaStatus" in this._listener) { + this._listener.onRemoteMediaStatus(this); + } + } + break; + default: + break; + } + }, + _send: function(msg, data, callback) { data.id = this._id; send(msg, data, callback);