Index: chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java |
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 1c3eec18d51ed14ad39c050d63bb0a4e15215e3f..1f6786c9c4397de20ba05f31dd8f8b9f8212d133 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.app.Activity; |
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 @@ public class MediaRouteChooserDialogFactory extends MediaRouteDialogFactory { |
} |
} |
- @Override |
- public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() { |
- return new MediaRouteChooserDialogFragment() { |
- final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); |
- boolean mCancelled = false; |
- |
- @Override |
- public MediaRouteChooserDialog onCreateChooserDialog( |
- Context context, Bundle savedInstanceState) { |
- mVisibilitySaver.saveSystemVisibility(getActivity()); |
- return new MediaRouteChooserDialog(context); |
- } |
+ /** |
+ * 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; |
+ |
+ // 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; |
+ } |
- @Override |
- public void onStop() { |
- super.onStop(); |
- mVisibilitySaver.restoreSystemVisibility(getActivity()); |
- } |
+ Fragment(MediaRouteController controller, MediaStateListener player) { |
+ mController = controller; |
+ mPlayer = player; |
+ } |
- @Override |
- public void onCancel(DialogInterface dialog) { |
- mCancelled = true; |
+ @Override |
+ public MediaRouteChooserDialog onCreateChooserDialog( |
+ Context context, Bundle savedInstanceState) { |
+ mVisibilitySaver.saveSystemVisibility(getActivity()); |
+ mContext = context; |
+ return new MediaRouteChooserDialog(context); |
+ } |
- super.onCancel(dialog); |
- } |
+ @Override |
+ public void onStop() { |
+ super.onStop(); |
+ mVisibilitySaver.restoreSystemVisibility(getActivity()); |
+ } |
- @Override |
- public void onDismiss(DialogInterface dialog) { |
- super.onDismiss(dialog); |
+ @Override |
+ public void onCancel(DialogInterface dialog) { |
+ mCancelled = true; |
- if (mCancelled) { |
- mPlayer.onRouteDialogCancelled(); |
- return; |
- } |
+ 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); |
} |
} |