| Index: chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java
|
| index 1b3a473bbbe900fb7f229bd5a613eff34132bb31..48946898573edfc24c89e3da3764f4dbe7beb303 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java
|
| @@ -4,23 +4,43 @@
|
|
|
| package org.chromium.chrome.browser.media.router;
|
|
|
| +import android.app.Dialog;
|
| import android.content.Context;
|
| +import android.content.DialogInterface;
|
| +import android.content.DialogInterface.OnDismissListener;
|
| +import android.support.v4.app.FragmentActivity;
|
| +import android.support.v4.app.FragmentManager;
|
| +import android.support.v7.app.MediaRouteChooserDialogFragment;
|
| +import android.support.v7.app.MediaRouteDialogFactory;
|
| +import android.support.v7.media.MediaRouteSelector;
|
| +import android.support.v7.media.MediaRouter;
|
| +import android.support.v7.media.MediaRouter.Callback;
|
|
|
| +import org.chromium.base.ApplicationStatus;
|
| import org.chromium.base.annotations.CalledByNative;
|
| import org.chromium.base.annotations.JNINamespace;
|
| +import org.chromium.chrome.browser.media.remote.ChromeMediaRouteDialogFactory;
|
| +import org.chromium.chrome.browser.media.router.cast.MediaSource;
|
|
|
| /**
|
| * Implements the JNI interface called from the C++ Media Router dialog controller implementation
|
| * on Android.
|
| */
|
| @JNINamespace("media_router")
|
| -public class ChromeMediaRouterDialogController {
|
| - private static final String TAG = "cr.MediaRouter";
|
| +public class ChromeMediaRouterDialogController extends MediaRouter.Callback
|
| + implements OnDismissListener {
|
| + private static final String MEDIA_ROUTE_CHOOSER_DIALOG_FRAGMENT =
|
| + "android.support.v7.mediarouter:MediaRouteChooserDialogFragment";
|
|
|
| private final long mNativeDialogController;
|
| + private final MediaRouter mAndroidMediaRouter;
|
| + private MediaRouteChooserDialogFragment mChooserDialogFragment;
|
|
|
| /**
|
| - * Initializes the media router and its providers.
|
| + * Returns a new initialized {@link ChromeMediaRouterDialogController}.
|
| + * @param nativeDialogController the handle of the native object.
|
| + * @param context the application context.
|
| + * @return a new dialog controller to use from the native side.
|
| */
|
| @CalledByNative
|
| public static ChromeMediaRouterDialogController create(
|
| @@ -28,7 +48,92 @@ public class ChromeMediaRouterDialogController {
|
| return new ChromeMediaRouterDialogController(nativeDialogController, context);
|
| }
|
|
|
| + /**
|
| + * Shows the {@link MediaRouteChooserDialogFragment} dialog if it's not shown yet.
|
| + * @param sourceUrn the URN identifying the media source to filter the devices with.
|
| + */
|
| + @CalledByNative
|
| + public void createDialog(String sourceUrn) {
|
| + if (isShowingDialog()) return;
|
| +
|
| + MediaSource mediaSource = MediaSource.from(sourceUrn);
|
| + if (mediaSource == null) return;
|
| +
|
| + FragmentActivity currentActivity =
|
| + (FragmentActivity) ApplicationStatus.getLastTrackedFocusedActivity();
|
| + if (currentActivity == null) return;
|
| +
|
| + FragmentManager fm = currentActivity.getSupportFragmentManager();
|
| + if (fm == null) return;
|
| +
|
| + if (fm.findFragmentByTag(MEDIA_ROUTE_CHOOSER_DIALOG_FRAGMENT) != null) return;
|
| +
|
| + MediaRouteSelector selector = mediaSource.buildRouteSelector();
|
| + mAndroidMediaRouter.addCallback(selector, this);
|
| +
|
| + MediaRouteDialogFactory factory = new ChromeMediaRouteDialogFactory();
|
| + mChooserDialogFragment = factory.onCreateChooserDialogFragment();
|
| + mChooserDialogFragment.setRouteSelector(selector);
|
| + mChooserDialogFragment.show(fm, MEDIA_ROUTE_CHOOSER_DIALOG_FRAGMENT);
|
| + fm.executePendingTransactions();
|
| +
|
| + Dialog dialog = mChooserDialogFragment.getDialog();
|
| + if (dialog == null) {
|
| + closeDialog();
|
| + return;
|
| + }
|
| +
|
| + dialog.setOnDismissListener(this);
|
| + }
|
| +
|
| + /**
|
| + * Closes the currently open dialog if it's open.
|
| + */
|
| + @CalledByNative
|
| + public void closeDialog() {
|
| + if (!isShowingDialog()) return;
|
| +
|
| + // Will remove MediaRouter.Callback in onDismiss().
|
| + mChooserDialogFragment.dismiss();
|
| + mChooserDialogFragment = null;
|
| + }
|
| +
|
| + /**
|
| + * @return if the media route chooser dialog is currently open.
|
| + */
|
| + @CalledByNative
|
| + public boolean isShowingDialog() {
|
| + return mChooserDialogFragment != null && mChooserDialogFragment.isVisible();
|
| + }
|
| +
|
| + /**
|
| + * {@link Callback} implementation.
|
| + */
|
| + @Override
|
| + public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
|
| + closeDialog();
|
| + }
|
| +
|
| + /**
|
| + * {@link OnDialogDismissListener} implementation.
|
| + */
|
| + @Override
|
| + public void onDismiss(DialogInterface dialog) {
|
| + mAndroidMediaRouter.removeCallback(this);
|
| + mChooserDialogFragment.dismiss();
|
| + mChooserDialogFragment = null;
|
| + }
|
| +
|
| private ChromeMediaRouterDialogController(long nativeDialogController, Context context) {
|
| mNativeDialogController = nativeDialogController;
|
| + MediaRouter androidMediaRouter = null;
|
| + try {
|
| + // Pre-MR1 versions of JB do not have the complete MediaRouter APIs,
|
| + // so getting the MediaRouter instance will throw an exception.
|
| + androidMediaRouter = MediaRouter.getInstance(context);
|
| + } catch (NoSuchMethodError e) {
|
| + androidMediaRouter = null;
|
| + }
|
| + mAndroidMediaRouter = androidMediaRouter;
|
| }
|
| }
|
|
|