Bug 1313601 - Disable presentation mode when taps disconnect from Chromecast on Android Notification Bar. r?snorp draft
authorKuoE0 <kuoe0.tw@gmail.com>
Fri, 28 Oct 2016 16:26:03 +0800
changeset 430891 cf5683a2e2f010f1c07098235e4c7453e6fb4445
parent 430076 b9d281a4914bf07689f9edeae45c9f7fe6aaaa3a
child 430892 1c440ab1e0bbc8b8119d77fe13a951bc9c040ade
push id33922
push userbmo:kuoe0@mozilla.com
push dateFri, 28 Oct 2016 08:31:38 +0000
reviewerssnorp
bugs1313601
milestone52.0a1
Bug 1313601 - Disable presentation mode when taps disconnect from Chromecast on Android Notification Bar. r?snorp MozReview-Commit-ID: Ge83JjnPSJg
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
mobile/android/base/java/org/mozilla/gecko/MediaPlayerManager.java
mobile/android/base/java/org/mozilla/gecko/RemotePresentationService.java
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -2036,17 +2036,17 @@ public class BrowserApp extends GeckoApp
 
                         if (mediaManagerClass != null) {
                             try {
                                 final String tag = "";
                                 mediaManagerClass.getDeclaredField("MEDIA_PLAYER_TAG").get(tag);
                                 Log.i(LOGTAG, "Found tag " + tag);
                                 final Fragment frag = getSupportFragmentManager().findFragmentByTag(tag);
                                 if (frag == null) {
-                                    final Method getInstance = mediaManagerClass.getMethod("newInstance", (Class[]) null);
+                                    final Method getInstance = mediaManagerClass.getMethod("getInstance", (Class[]) null);
                                     final Fragment mpm = (Fragment) getInstance.invoke(null);
                                     getSupportFragmentManager().beginTransaction().disallowAddToBackStack().add(mpm, tag).commit();
                                 }
                             } catch (Exception ex) {
                                 Log.e(LOGTAG, "Error initializing media manager", ex);
                             }
                         }
                     }
--- a/mobile/android/base/java/org/mozilla/gecko/MediaPlayerManager.java
+++ b/mobile/android/base/java/org/mozilla/gecko/MediaPlayerManager.java
@@ -30,23 +30,30 @@ import java.util.Map;
  * Manages a list of GeckoMediaPlayers methods (i.e. Chromecast/Miracast). Routes messages
  * from Gecko to the correct caster based on the id of the display
  */
 public class MediaPlayerManager extends Fragment implements NativeEventListener {
     /**
      * Create a new instance of DetailsFragment, initialized to
      * show the text at 'index'.
      */
+
+    private static MediaPlayerManager instance = null;
+
     @ReflectionTarget
-    public static MediaPlayerManager newInstance() {
+    public static MediaPlayerManager getInstance() {
+        if (instance != null) {
+            return instance;
+        }
         if (Versions.feature17Plus) {
-            return new PresentationMediaPlayerManager();
+            instance = (MediaPlayerManager) new PresentationMediaPlayerManager();
         } else {
-            return new MediaPlayerManager();
+            instance = new MediaPlayerManager();
         }
+        return instance;
     }
 
     private static final String LOGTAG = "GeckoMediaPlayerManager";
     protected boolean isPresentationMode = false; // Used to prevent mirroring when Presentation API is used.
 
     @ReflectionTarget
     public static final String MEDIA_PLAYER_TAG = "MPManagerFragment";
 
@@ -141,20 +148,18 @@ public class MediaPlayerManager extends 
             final GeckoPresentationDisplay display = displays.get(message.getString("id"));
             if (display == null) {
                 Log.e(LOGTAG, "Couldn't find a display for this id: " + message.getString("id") + " for message: " + event);
                 return;
             }
 
             if ("AndroidCastDevice:Start".equals(event)) {
                 display.start(callback);
-                isPresentationMode = true;
             } else if ("AndroidCastDevice:Stop".equals(event)) {
                 display.stop(callback);
-                isPresentationMode = false;
             }
         }
     }
 
     private final MediaRouter.Callback callback =
         new MediaRouter.Callback() {
             @Override
             public void onRouteRemoved(MediaRouter router, RouteInfo route) {
@@ -289,10 +294,14 @@ public class MediaPlayerManager extends 
             .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
             .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
             .addControlCategory(CastMediaControlIntent.categoryForCast(ChromeCastPlayer.MIRROR_RECEIVER_APP_ID))
             .addControlCategory(CastMediaControlIntent.categoryForCast(ChromeCastDisplay.REMOTE_DISPLAY_APP_ID))
             .build();
         mediaRouter.addCallback(selectorBuilder, callback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
     }
 
+    public void setPresentationMode(boolean isPresentationMode) {
+        this.isPresentationMode = isPresentationMode;
+    }
+
     protected void updatePresentation() { /* Overridden in sub-classes. */ }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/RemotePresentationService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/RemotePresentationService.java
@@ -75,22 +75,25 @@ public class RemotePresentationService e
         dismissPresentation();
     }
 
     private void dismissPresentation() {
         if (presentation != null) {
             presentation.dismiss();
             presentation = null;
             ScreenManagerHelper.removeDisplay(screenId);
+            MediaPlayerManager.getInstance().setPresentationMode(false);
         }
     }
 
     private void createPresentation() {
         dismissPresentation();
 
+        MediaPlayerManager.getInstance().setPresentationMode(true);
+
         DisplayMetrics metrics = new DisplayMetrics();
         getDisplay().getMetrics(metrics);
         screenId = ScreenManagerHelper.addDisplay(ScreenManagerHelper.DISPLAY_VIRTUAL,
                                                   metrics.widthPixels,
                                                   metrics.heightPixels,
                                                   metrics.density);
 
         VirtualPresentation virtualPresentation = new VirtualPresentation(this, getDisplay());