[Android,Cast] Fix media flinging dialogs when the activity is restarted

BUG=618993
TEST=manual

Review-Url: https://codereview.chromium.org/2091043002
Cr-Commit-Position: refs/heads/master@{#401838}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java
index 1c3eec1..1f6786c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java
@@ -8,6 +8,7 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.os.Handler;
 import android.support.v7.app.MediaRouteChooserDialog;
 import android.support.v7.app.MediaRouteChooserDialogFragment;
 import android.support.v7.app.MediaRouteDialogFactory;
@@ -61,44 +62,77 @@
         }
     }
 
-    @Override
-    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
-        return new MediaRouteChooserDialogFragment() {
-            final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver();
-            boolean mCancelled = false;
+    /**
+     * A dialog fragment for choosing a media route that saves system visibility for handling
+     * fullscreen state of Chrome correctly. Needs to be a named public static class, see
+     * https://crbug.com/618993.
+     */
+    public static final class Fragment extends MediaRouteChooserDialogFragment {
+        final Handler mHandler = new Handler();
+        final MediaRouteController mController;
+        final MediaStateListener mPlayer;
+        final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver();
+        boolean mCancelled = false;
+        Context mContext = null;
 
-            @Override
-            public MediaRouteChooserDialog onCreateChooserDialog(
-                    Context context, Bundle savedInstanceState) {
-                mVisibilitySaver.saveSystemVisibility(getActivity());
-                return new MediaRouteChooserDialog(context);
-            }
-
-            @Override
-            public void onStop() {
-                super.onStop();
-                mVisibilitySaver.restoreSystemVisibility(getActivity());
-            }
-
-            @Override
-            public void onCancel(DialogInterface dialog) {
-                mCancelled = true;
-
-                super.onCancel(dialog);
-            }
-
-            @Override
-            public void onDismiss(DialogInterface dialog) {
-                super.onDismiss(dialog);
-
-                if (mCancelled) {
-                    mPlayer.onRouteDialogCancelled();
-                    return;
+        // The class has to be a public static class with a zero-argument constructor.
+        // Since we can't pass any callbacks to the fragment easily, just close the dialog.
+        // See https://crbug.com/618993.
+        public Fragment() {
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    Fragment.this.dismiss();
                 }
+            });
+            mController = null;
+            mPlayer = null;
+        }
 
+        Fragment(MediaRouteController controller, MediaStateListener player) {
+            mController = controller;
+            mPlayer = player;
+        }
+
+        @Override
+        public MediaRouteChooserDialog onCreateChooserDialog(
+                Context context, Bundle savedInstanceState) {
+            mVisibilitySaver.saveSystemVisibility(getActivity());
+            mContext = context;
+            return new MediaRouteChooserDialog(context);
+        }
+
+        @Override
+        public void onStop() {
+            super.onStop();
+            mVisibilitySaver.restoreSystemVisibility(getActivity());
+        }
+
+        @Override
+        public void onCancel(DialogInterface dialog) {
+            mCancelled = true;
+
+            super.onCancel(dialog);
+        }
+
+        @Override
+        public void onDismiss(DialogInterface dialog) {
+            super.onDismiss(dialog);
+
+            if (mCancelled) {
+                if (mPlayer != null) mPlayer.onRouteDialogCancelled();
+                return;
+            }
+
+            if (mController != null) {
                 MediaRouter router = MediaRouter.getInstance(mContext);
                 mController.onRouteSelected(mPlayer, router, router.getSelectedRoute());
             }
-        };
+        }
+    }
+
+    @Override
+    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
+        return new Fragment(mController, mPlayer);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java
index 7caf35d..0f48bfa5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java
@@ -46,22 +46,31 @@
         }
     }
 
+    /**
+     * A dialog fragment for controlling a media route that saves system visibility for
+     * handling fullscreen state of Chrome correctly. Needs to be a named public static class,
+     * see https://crbug.com/618993.
+     */
+    public static final class Fragment extends MediaRouteControllerDialogFragment {
+        final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver();
+
+        public Fragment() {}
+
+        @Override
+        public Dialog onCreateDialog(Bundle saved) {
+            mVisibilitySaver.saveSystemVisibility(getActivity());
+            return new MediaRouteControllerDialog(getActivity());
+        }
+
+        @Override
+        public void onStop() {
+            super.onStop();
+            mVisibilitySaver.restoreSystemVisibility(getActivity());
+        }
+    }
+
     @Override
     public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
-        return new MediaRouteControllerDialogFragment() {
-            final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver();
-
-            @Override
-            public Dialog onCreateDialog(Bundle saved) {
-                mVisibilitySaver.saveSystemVisibility(getActivity());
-                return new MediaRouteControllerDialog(getActivity());
-            }
-
-            @Override
-            public void onStop() {
-                super.onStop();
-                mVisibilitySaver.restoreSystemVisibility(getActivity());
-            }
-        };
+        return new MediaRouteControllerDialogFragment();
     }
 }