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