Bug 1302453 - part2 : notify MediaControlService when the media is resumed. draft
authorAlastor Wu <alwu@mozilla.com>
Thu, 27 Oct 2016 10:00:25 +0800
changeset 430044 4cd8b3a2370f279d4d3aa9a18ca87d48117120bf
parent 430043 c00e329a9d0744193b6119e0c731aabb8920d136
child 535108 bb985d5e2de57d2fda7e3224803b8de86d7e298e
push id33720
push useralwu@mozilla.com
push dateThu, 27 Oct 2016 02:01:52 +0000
bugs1302453
milestone52.0a1
Bug 1302453 - part2 : notify MediaControlService when the media is resumed. When user resumes media from the page, we should notify MediaControlService so that it can change the playing icon to the correct status. MozReview-Commit-ID: 15e2GrxvB6a
mobile/android/base/java/org/mozilla/gecko/Tabs.java
mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java
mobile/android/chrome/content/browser.js
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java
+++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java
@@ -577,18 +577,23 @@ public class Tabs implements GeckoEventL
                 notifyListeners(tab, TabEvents.RECORDING_CHANGE);
             } else if (event.equals("Tab:StreamStop")) {
                 tab.setRecording(false);
                 notifyListeners(tab, TabEvents.RECORDING_CHANGE);
             } else if (event.equals("Tab:AudioPlayingChange")) {
                 tab.setIsAudioPlaying(message.getBoolean("isAudioPlaying"));
                 notifyListeners(tab, TabEvents.AUDIO_PLAYING_CHANGE);
             } else if (event.equals("Tab:MediaPlaybackChange")) {
-                tab.setIsMediaPlaying(message.getBoolean("active"));
-                notifyListeners(tab, TabEvents.MEDIA_PLAYING_CHANGE);
+                final String status = message.getString("status");
+                if (status.equals("resume")) {
+                    notifyListeners(tab, TabEvents.MEDIA_PLAYING_RESUME);
+                } else {
+                    tab.setIsMediaPlaying(status.equals("start"));
+                    notifyListeners(tab, TabEvents.MEDIA_PLAYING_CHANGE);
+                }
             }
 
         } catch (Exception e) {
             Log.w(LOGTAG, "handleMessage threw for " + event, e);
         }
     }
 
     public void refreshThumbnails() {
@@ -639,16 +644,17 @@ public class Tabs implements GeckoEventL
         SECURITY_CHANGE,
         DESKTOP_MODE_CHANGE,
         RECORDING_CHANGE,
         BOOKMARK_ADDED,
         BOOKMARK_REMOVED,
         AUDIO_PLAYING_CHANGE,
         OPENED_FROM_TABS_TRAY,
         MEDIA_PLAYING_CHANGE,
+        MEDIA_PLAYING_RESUME
     }
 
     public void notifyListeners(Tab tab, TabEvents msg) {
         notifyListeners(tab, msg, "");
     }
 
     public void notifyListeners(final Tab tab, final TabEvents msg, final String data) {
         if (tab == null &&
--- a/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java
@@ -95,24 +95,32 @@ public class MediaControlService extends
     public void onTabChanged(Tab tab, Tabs.TabEvents msg, String data) {
         if (!mInitialize) {
             return;
         }
 
         final Tab playingTab = mTabReference.get();
         switch (msg) {
             case MEDIA_PLAYING_CHANGE:
+                // The 'MEDIA_PLAYING_CHANGE' would only be received when the
+                // media starts or ends.
                 if (playingTab != tab && tab.isMediaPlaying()) {
                     mTabReference = new WeakReference<>(tab);
                     mController.getTransportControls().sendCustomAction(ACTION_START, null);
                 } else if (playingTab == tab && !tab.isMediaPlaying()) {
                     mController.getTransportControls().stop();
                 }
                 break;
-
+            case MEDIA_PLAYING_RESUME:
+                // user resume the paused-by-control media from page so that we
+                // should make the control interface consistent.
+                if (playingTab == tab && !isMediaPlaying()) {
+                    mController.getTransportControls().play();
+                }
+                break;
             case CLOSED:
                 if (playingTab == null || playingTab == tab) {
                     // Remove the controls when the playing tab disappeared or was closed.
                     mController.getTransportControls().stop();
                 }
                 break;
             case FAVICON:
                 if (playingTab == tab) {
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -3514,16 +3514,17 @@ Tab.prototype = {
 
     // Note that the XBL binding is untrusted
     this.browser.addEventListener("PluginBindingAttached", this, true, true);
     this.browser.addEventListener("VideoBindingAttached", this, true, true);
     this.browser.addEventListener("VideoBindingCast", this, true, true);
 
     Services.obs.addObserver(this, "before-first-paint", false);
     Services.obs.addObserver(this, "media-playback", false);
+    Services.obs.addObserver(this, "media-playback-resumed", false);
 
     // Always intialise new tabs with basic session store data to avoid
     // problems with functions that always expect it to be present
     this.browser.__SS_data = {
       entries: [{
         url: aURL,
         title: truncate(title, MAX_TITLE_LENGTH)
       }],
@@ -3624,16 +3625,17 @@ Tab.prototype = {
     this.browser.removeEventListener("TabPreZombify", this, true);
 
     this.browser.removeEventListener("PluginBindingAttached", this, true, true);
     this.browser.removeEventListener("VideoBindingAttached", this, true, true);
     this.browser.removeEventListener("VideoBindingCast", this, true, true);
 
     Services.obs.removeObserver(this, "before-first-paint");
     Services.obs.removeObserver(this, "media-playback", false);
+    Services.obs.removeObserver(this, "media-playback-resumed", false);
 
     // Make sure the previously selected panel remains selected. The selected panel of a deck is
     // not stable when panels are removed.
     let selectedPanel = BrowserApp.deck.selectedPanel;
     BrowserApp.deck.removeChild(this.browser);
     BrowserApp.deck.selectedPanel = selectedPanel;
 
     this.browser = null;
@@ -4390,26 +4392,34 @@ Tab.prototype = {
 
           if (contentDocument instanceof Ci.nsIImageDocument) {
             contentDocument.shrinkToFit();
           }
         }
         break;
 
       case "media-playback":
+      case "media-playback-resumed":
         if (!aSubject) {
           return;
         }
 
         let winId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data;
         if (this.browser.outerWindowID == winId) {
+          let status;
+          if (aTopic == "media-playback") {
+            status = aData === "active" ? "start" : "end";
+          } else if (aTopic == "media-playback-resumed") {
+            status = "resume";
+          }
+
           Messaging.sendRequest({
             type: "Tab:MediaPlaybackChange",
             tabID: this.id,
-            active: aData === "active"
+            status: status
           });
         }
         break;
     }
   },
 
   // nsIBrowserTab
   get window() {