| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package org.chromium.chrome.browser.media.router; |
| |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.support.v4.app.DialogFragment; |
| import android.support.v4.app.FragmentManager; |
| import android.support.v7.app.MediaRouteChooserDialog; |
| import android.support.v7.app.MediaRouteChooserDialogFragment; |
| import android.support.v7.media.MediaRouteSelector; |
| import android.support.v7.media.MediaRouter; |
| import android.support.v7.mediarouter.R; |
| import android.view.View; |
| import android.widget.AdapterView; |
| import android.widget.ListView; |
| |
| /** |
| * Manages the dialog responsible for selecting a {@link MediaSink}. |
| */ |
| public class MediaRouteChooserDialogManager extends BaseMediaRouteDialogManager { |
| |
| private static final String DIALOG_FRAGMENT_TAG = |
| "android.support.v7.mediarouter:MediaRouteChooserDialogFragment"; |
| |
| public MediaRouteChooserDialogManager( |
| String sourceId, MediaRouteSelector routeSelector, MediaRouteDialogDelegate delegate) { |
| super(sourceId, routeSelector, delegate); |
| } |
| |
| /** |
| * Fragment implementation for MediaRouteChooserDialogManager. |
| */ |
| public static class Fragment extends MediaRouteChooserDialogFragment { |
| private final Handler mHandler = new Handler(); |
| private final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); |
| private BaseMediaRouteDialogManager mManager; |
| private boolean mIsSinkSelected; |
| |
| public Fragment() { |
| mHandler.post(new Runnable() { |
| @Override |
| public void run() { |
| Fragment.this.dismiss(); |
| } |
| }); |
| } |
| |
| public Fragment(BaseMediaRouteDialogManager manager) { |
| mManager = manager; |
| } |
| |
| @Override |
| public MediaRouteChooserDialog onCreateChooserDialog( |
| Context context, Bundle savedInstanceState) { |
| MediaRouteChooserDialog dialog = new DelayedSelectionDialog(context, getTheme()); |
| dialog.setCanceledOnTouchOutside(true); |
| return dialog; |
| } |
| |
| @Override |
| public void onStart() { |
| mVisibilitySaver.saveSystemVisibility(getActivity()); |
| super.onStart(); |
| } |
| |
| @Override |
| public void onStop() { |
| super.onStop(); |
| mVisibilitySaver.restoreSystemVisibility(getActivity()); |
| } |
| |
| @Override |
| public void onDismiss(DialogInterface dialog) { |
| super.onDismiss(dialog); |
| |
| if (!mIsSinkSelected) mManager.delegate().onDialogCancelled(); |
| } |
| |
| private class DelayedSelectionDialog extends MediaRouteChooserDialog { |
| public DelayedSelectionDialog(Context context) { |
| super(context); |
| } |
| |
| public DelayedSelectionDialog(Context context, int theme) { |
| super(context, theme); |
| } |
| |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| ListView listView = (ListView) findViewById(R.id.mr_chooser_list); |
| if (listView != null) { |
| listView.setOnItemClickListener(Fragment.this::onItemClick); |
| } |
| } |
| } |
| |
| private void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
| MediaRouter.RouteInfo routeInfo = |
| (MediaRouter.RouteInfo) parent.getItemAtPosition(position); |
| if (routeInfo != null && routeInfo.isEnabled()) { |
| MediaSink newSink = MediaSink.fromRoute(routeInfo); |
| |
| // When a item is clicked, the route is not selected right away. Instead, the route |
| // selection is postponed to the actual session launch. |
| mManager.delegate().onSinkSelected(mManager.sourceId(), newSink); |
| mIsSinkSelected = true; |
| |
| dismiss(); |
| } |
| } |
| } |
| |
| @Override |
| protected DialogFragment openDialogInternal(FragmentManager fm) { |
| if (fm.findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) return null; |
| |
| Fragment fragment = new Fragment(this); |
| fragment.setRouteSelector(routeSelector()); |
| fragment.show(fm, DIALOG_FRAGMENT_TAG); |
| fm.executePendingTransactions(); |
| |
| return fragment; |
| } |
| } |