111417b1cfde8f1749905f2d735623af9214148afJeff Brown/*
211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Copyright (C) 2013 The Android Open Source Project
311417b1cfde8f1749905f2d735623af9214148afJeff Brown *
411417b1cfde8f1749905f2d735623af9214148afJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
511417b1cfde8f1749905f2d735623af9214148afJeff Brown * you may not use this file except in compliance with the License.
611417b1cfde8f1749905f2d735623af9214148afJeff Brown * You may obtain a copy of the License at
711417b1cfde8f1749905f2d735623af9214148afJeff Brown *
811417b1cfde8f1749905f2d735623af9214148afJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
911417b1cfde8f1749905f2d735623af9214148afJeff Brown *
1011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Unless required by applicable law or agreed to in writing, software
1111417b1cfde8f1749905f2d735623af9214148afJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1211417b1cfde8f1749905f2d735623af9214148afJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1311417b1cfde8f1749905f2d735623af9214148afJeff Brown * See the License for the specific language governing permissions and
1411417b1cfde8f1749905f2d735623af9214148afJeff Brown * limitations under the License.
1511417b1cfde8f1749905f2d735623af9214148afJeff Brown */
1611417b1cfde8f1749905f2d735623af9214148afJeff Brown
1711417b1cfde8f1749905f2d735623af9214148afJeff Brownpackage android.support.v7.app;
1811417b1cfde8f1749905f2d735623af9214148afJeff Brown
1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.app.Dialog;
20eff7719415542ba819054863b0995f07742a7a8aJeff Brownimport android.content.Context;
21d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seoimport android.content.res.Configuration;
2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
2311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v4.app.DialogFragment;
2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouteSelector;
2511417b1cfde8f1749905f2d735623af9214148afJeff Brown
2611417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2711417b1cfde8f1749905f2d735623af9214148afJeff Brown * Media route chooser dialog fragment.
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
29eff7719415542ba819054863b0995f07742a7a8aJeff Brown * Creates a {@link MediaRouteChooserDialog}.  The application may subclass
30eff7719415542ba819054863b0995f07742a7a8aJeff Brown * this dialog fragment to customize the media route chooser dialog.
3111417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
3211417b1cfde8f1749905f2d735623af9214148afJeff Brown */
3311417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic class MediaRouteChooserDialogFragment extends DialogFragment {
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final String ARGUMENT_SELECTOR = "selector";
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown
366e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim    private MediaRouteChooserDialog mDialog;
3711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private MediaRouteSelector mSelector;
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown
39eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
40eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Creates a media route chooser dialog fragment.
41eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * <p>
42eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * All subclasses of this class must also possess a default constructor.
43eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * </p>
44eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteChooserDialogFragment() {
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown        setCancelable(true);
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the media route selector for filtering the routes that the user can select.
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The selector, never null.
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteSelector getRouteSelector() {
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRouteSelector();
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mSelector;
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureRouteSelector() {
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mSelector == null) {
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown            Bundle args = getArguments();
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (args != null) {
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown                mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
6411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6511417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mSelector == null) {
6611417b1cfde8f1749905f2d735623af9214148afJeff Brown                mSelector = MediaRouteSelector.EMPTY;
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Sets the media route selector for filtering the routes that the user can select.
7311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * This method must be called before the fragment is added.
7411417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
7511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param selector The selector to set.
7611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public void setRouteSelector(MediaRouteSelector selector) {
7811417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (selector == null) {
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown            throw new IllegalArgumentException("selector must not be null");
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRouteSelector();
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (!mSelector.equals(selector)) {
8411417b1cfde8f1749905f2d735623af9214148afJeff Brown            mSelector = selector;
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown            Bundle args = getArguments();
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (args == null) {
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown                args = new Bundle();
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown            args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
9111417b1cfde8f1749905f2d735623af9214148afJeff Brown            setArguments(args);
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown            MediaRouteChooserDialog dialog = (MediaRouteChooserDialog)getDialog();
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (dialog != null) {
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown                dialog.setRouteSelector(selector);
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown
100eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
101eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Called when the chooser dialog is being created.
102eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * <p>
103eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Subclasses may override this method to customize the dialog.
104eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * </p>
105eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
106eff7719415542ba819054863b0995f07742a7a8aJeff Brown    public MediaRouteChooserDialog onCreateChooserDialog(
107eff7719415542ba819054863b0995f07742a7a8aJeff Brown            Context context, Bundle savedInstanceState) {
108eff7719415542ba819054863b0995f07742a7a8aJeff Brown        return new MediaRouteChooserDialog(context);
109eff7719415542ba819054863b0995f07742a7a8aJeff Brown    }
110eff7719415542ba819054863b0995f07742a7a8aJeff Brown
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Dialog onCreateDialog(Bundle savedInstanceState) {
11305c8a189672f5d883555e068549c0a84eeeff4aaAdam Powell        mDialog = onCreateChooserDialog(getContext(), savedInstanceState);
1146e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim        mDialog.setRouteSelector(getRouteSelector());
1156e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim        return mDialog;
1166e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim    }
117d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo
118d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    @Override
119d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    public void onConfigurationChanged(Configuration newConfig) {
120d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        super.onConfigurationChanged(newConfig);
121d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        if (mDialog != null) {
122d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo            mDialog.updateLayout();
123d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        }
124d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    }
12511417b1cfde8f1749905f2d735623af9214148afJeff Brown}
126