111417b1cfde8f1749905f2d735623af9214148afJeff Brown/*
2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 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
17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.mediarouter.app;
1811417b1cfde8f1749905f2d735623af9214148afJeff Brown
1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.app.Dialog;
20eff7719415542ba819054863b0995f07742a7a8aJeff Brownimport android.content.Context;
21d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seoimport android.content.res.Configuration;
2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
23f2d1695bf23114f2a5d6bfc9e092a4bfcb5b2701Aurimas Liutikas
24ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.fragment.app.DialogFragment;
25ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.mediarouter.media.MediaRouteSelector;
2611417b1cfde8f1749905f2d735623af9214148afJeff Brown
2711417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Media route chooser dialog fragment.
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
30eff7719415542ba819054863b0995f07742a7a8aJeff Brown * Creates a {@link MediaRouteChooserDialog}.  The application may subclass
31eff7719415542ba819054863b0995f07742a7a8aJeff Brown * this dialog fragment to customize the media route chooser dialog.
3211417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown */
3411417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic class MediaRouteChooserDialogFragment extends DialogFragment {
35f8a82a95a1a962ec05536f7196fcee0f1384a497Jake Wharton    private static final String ARGUMENT_SELECTOR = "selector";
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown
376e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim    private MediaRouteChooserDialog mDialog;
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private MediaRouteSelector mSelector;
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown
40eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
41eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Creates a media route chooser dialog fragment.
42eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * <p>
43eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * All subclasses of this class must also possess a default constructor.
44eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * </p>
45eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteChooserDialogFragment() {
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown        setCancelable(true);
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the media route selector for filtering the routes that the user can select.
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The selector, never null.
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteSelector getRouteSelector() {
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRouteSelector();
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mSelector;
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureRouteSelector() {
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mSelector == null) {
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown            Bundle args = getArguments();
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (args != null) {
6411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mSelector = MediaRouteSelector.fromBundle(args.getBundle(ARGUMENT_SELECTOR));
6511417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6611417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mSelector == null) {
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown                mSelector = MediaRouteSelector.EMPTY;
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
7311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Sets the media route selector for filtering the routes that the user can select.
7411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * This method must be called before the fragment is added.
7511417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
7611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param selector The selector to set.
7711417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7811417b1cfde8f1749905f2d735623af9214148afJeff Brown    public void setRouteSelector(MediaRouteSelector selector) {
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (selector == null) {
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown            throw new IllegalArgumentException("selector must not be null");
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRouteSelector();
8411417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (!mSelector.equals(selector)) {
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mSelector = selector;
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown            Bundle args = getArguments();
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (args == null) {
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown                args = new Bundle();
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
9111417b1cfde8f1749905f2d735623af9214148afJeff Brown            args.putBundle(ARGUMENT_SELECTOR, selector.asBundle());
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown            setArguments(args);
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown            MediaRouteChooserDialog dialog = (MediaRouteChooserDialog)getDialog();
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (dialog != null) {
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown                dialog.setRouteSelector(selector);
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown
101eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
102eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Called when the chooser dialog is being created.
103eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * <p>
104eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * Subclasses may override this method to customize the dialog.
105eff7719415542ba819054863b0995f07742a7a8aJeff Brown     * </p>
106eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
107eff7719415542ba819054863b0995f07742a7a8aJeff Brown    public MediaRouteChooserDialog onCreateChooserDialog(
108eff7719415542ba819054863b0995f07742a7a8aJeff Brown            Context context, Bundle savedInstanceState) {
109eff7719415542ba819054863b0995f07742a7a8aJeff Brown        return new MediaRouteChooserDialog(context);
110eff7719415542ba819054863b0995f07742a7a8aJeff Brown    }
111eff7719415542ba819054863b0995f07742a7a8aJeff Brown
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
11311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Dialog onCreateDialog(Bundle savedInstanceState) {
11405c8a189672f5d883555e068549c0a84eeeff4aaAdam Powell        mDialog = onCreateChooserDialog(getContext(), savedInstanceState);
1156e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim        mDialog.setRouteSelector(getRouteSelector());
1166e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim        return mDialog;
1176e547065f21f1645b3e9d5b3a3fd9720be8aede8Jaewan Kim    }
118d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo
119d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    @Override
120d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    public void onConfigurationChanged(Configuration newConfig) {
121d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        super.onConfigurationChanged(newConfig);
122d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        if (mDialog != null) {
123d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo            mDialog.updateLayout();
124d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo        }
125d52e30f3736a821e45266c28c334756f5f7e55c3Jae Seo    }
12611417b1cfde8f1749905f2d735623af9214148afJeff Brown}
127