MediaRouteProviderDescriptor.java revision 11417b1cfde8f1749905f2d735623af9214148af
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 Brownpackage android.support.v7.media;
1711417b1cfde8f1749905f2d735623af9214148afJeff Brown
1811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.content.IntentFilter;
1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
2011417b1cfde8f1749905f2d735623af9214148afJeff Brown
2111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.ArrayList;
2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Arrays;
2311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Collections;
2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.List;
2511417b1cfde8f1749905f2d735623af9214148afJeff Brown
2611417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
2711417b1cfde8f1749905f2d735623af9214148afJeff Brown * Describes the state of a media route provider and the routes that it publishes.
2811417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
2911417b1cfde8f1749905f2d735623af9214148afJeff Brown * This object is immutable once created using a {@link Builder} instance.
3011417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
3111417b1cfde8f1749905f2d735623af9214148afJeff Brown */
3211417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic final class MediaRouteProviderDescriptor {
3311417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ROUTES = "routes";
3411417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_ACTIVE_SCAN_REQUIRED = "activeScanRequired";
3511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String KEY_DISCOVERABLE_CONTROL_FILTERS =
3611417b1cfde8f1749905f2d735623af9214148afJeff Brown            "discoverableControlFilters";
3711417b1cfde8f1749905f2d735623af9214148afJeff Brown
3811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final Bundle mBundle;
3911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private List<MediaRouteDescriptor> mRoutes;
4011417b1cfde8f1749905f2d735623af9214148afJeff Brown    private List<IntentFilter> mDiscoverableControlFilters;
4111417b1cfde8f1749905f2d735623af9214148afJeff Brown
4211417b1cfde8f1749905f2d735623af9214148afJeff Brown    private MediaRouteProviderDescriptor(Bundle bundle,
4311417b1cfde8f1749905f2d735623af9214148afJeff Brown            List<MediaRouteDescriptor> routes, List<IntentFilter> discoverableControlFilters) {
4411417b1cfde8f1749905f2d735623af9214148afJeff Brown        mBundle = bundle;
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown        mRoutes = routes;
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown        mDiscoverableControlFilters = discoverableControlFilters;
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the list of all routes that this provider has published.
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public List<MediaRouteDescriptor> getRoutes() {
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRoutes();
5411417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mRoutes;
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureRoutes() {
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mRoutes == null) {
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown            ArrayList<Bundle> routeBundles = mBundle.<Bundle>getParcelableArrayList(KEY_ROUTES);
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (routeBundles == null || routeBundles.isEmpty()) {
6111417b1cfde8f1749905f2d735623af9214148afJeff Brown                mRoutes = Collections.<MediaRouteDescriptor>emptyList();
6211417b1cfde8f1749905f2d735623af9214148afJeff Brown            } else {
6311417b1cfde8f1749905f2d735623af9214148afJeff Brown                final int count = routeBundles.size();
6411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mRoutes = new ArrayList<MediaRouteDescriptor>(count);
6511417b1cfde8f1749905f2d735623af9214148afJeff Brown                for (int i = 0; i < count; i++) {
6611417b1cfde8f1749905f2d735623af9214148afJeff Brown                    mRoutes.add(MediaRouteDescriptor.fromBundle(routeBundles.get(i)));
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown                }
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
7011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
7111417b1cfde8f1749905f2d735623af9214148afJeff Brown
7211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
7311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets a list of {@link MediaControlIntent media route control filters} that
7411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * describe the union of capabilities of all routes that this provider can
7511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * possibly discover.
7611417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
7711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @see MediaRouter.ProviderInfo#getDiscoverableControlFilters
7811417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
7911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public List<IntentFilter> getDiscoverableControlFilters() {
8011417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureDiscoverableControlFilters();
8111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mDiscoverableControlFilters;
8211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8311417b1cfde8f1749905f2d735623af9214148afJeff Brown
8411417b1cfde8f1749905f2d735623af9214148afJeff Brown    private void ensureDiscoverableControlFilters() {
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mDiscoverableControlFilters == null) {
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown            mDiscoverableControlFilters =
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown                    mBundle.<IntentFilter>getParcelableArrayList(KEY_DISCOVERABLE_CONTROL_FILTERS);
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mDiscoverableControlFilters == null || mDiscoverableControlFilters.isEmpty()) {
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown                mDiscoverableControlFilters = Collections.<IntentFilter>emptyList();
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
9111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown
9411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if the provider requires active scans to discover routes.
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @see MediaRouter.ProviderInfo#isActiveScanRequired
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @see MediaRouter#CALLBACK_FLAG_ACTIVE_SCAN
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isActiveScanRequired() {
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle.getBoolean(KEY_ACTIVE_SCAN_REQUIRED, false);
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown
10411417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Returns true if the route provider descriptor and all of the routes that
10611417b1cfde8f1749905f2d735623af9214148afJeff Brown     * it contains have all of the required fields.
10711417b1cfde8f1749905f2d735623af9214148afJeff Brown     * <p>
10811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * This verification is deep.  If the provider descriptor is known to be
10911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * valid then it is not necessary to call {@link #isValid} on each of its routes.
11011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * </p>
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean isValid() {
11311417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureDiscoverableControlFilters();
11411417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (mDiscoverableControlFilters.contains(null)) {
11511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return false;
11611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
11711417b1cfde8f1749905f2d735623af9214148afJeff Brown        ensureRoutes();
11811417b1cfde8f1749905f2d735623af9214148afJeff Brown        final int routeCount = mRoutes.size();
11911417b1cfde8f1749905f2d735623af9214148afJeff Brown        for (int i = 0; i < routeCount; i++) {
12011417b1cfde8f1749905f2d735623af9214148afJeff Brown            MediaRouteDescriptor route = mRoutes.get(i);
12111417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (route == null || !route.isValid()) {
12211417b1cfde8f1749905f2d735623af9214148afJeff Brown                return false;
12311417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
12411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
12511417b1cfde8f1749905f2d735623af9214148afJeff Brown        return true;
12611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
12711417b1cfde8f1749905f2d735623af9214148afJeff Brown
12811417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
12911417b1cfde8f1749905f2d735623af9214148afJeff Brown    public String toString() {
13011417b1cfde8f1749905f2d735623af9214148afJeff Brown        StringBuilder result = new StringBuilder();
13111417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("MediaRouteProviderDescriptor{ ");
13211417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("isActiveScanRequired=").append(isActiveScanRequired());
13311417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", discoverableControlFilters=").append(
13411417b1cfde8f1749905f2d735623af9214148afJeff Brown                Arrays.toString(getDiscoverableControlFilters().toArray()));
13511417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", routes=").append(
13611417b1cfde8f1749905f2d735623af9214148afJeff Brown                Arrays.toString(getRoutes().toArray()));
13711417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append(", isValid=").append(isValid());
13811417b1cfde8f1749905f2d735623af9214148afJeff Brown        result.append("}");
13911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return result.toString();
14011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
14111417b1cfde8f1749905f2d735623af9214148afJeff Brown
14211417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
14311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Converts this object to a bundle for serialization.
14411417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
14511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The contents of the object represented as a bundle.
14611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
14711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public Bundle asBundle() {
14811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mBundle;
14911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
15011417b1cfde8f1749905f2d735623af9214148afJeff Brown
15111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
15211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Creates an instance from a bundle.
15311417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
15411417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param bundle The bundle, or null if none.
15511417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The new instance, or null if the bundle was null.
15611417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
15711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static MediaRouteProviderDescriptor fromBundle(Bundle bundle) {
15811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return bundle != null ? new MediaRouteProviderDescriptor(bundle, null, null) : null;
15911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
16011417b1cfde8f1749905f2d735623af9214148afJeff Brown
16111417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
16211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Builder for {@link MediaRouteProviderDescriptor media route provider descriptors}.
16311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
16411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public static final class Builder {
16511417b1cfde8f1749905f2d735623af9214148afJeff Brown        private final Bundle mBundle;
16611417b1cfde8f1749905f2d735623af9214148afJeff Brown        private ArrayList<MediaRouteDescriptor> mRoutes;
16711417b1cfde8f1749905f2d735623af9214148afJeff Brown        private ArrayList<IntentFilter> mDiscoverableControlFilters;
16811417b1cfde8f1749905f2d735623af9214148afJeff Brown
16911417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
17011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates an empty media route provider descriptor builder.
17111417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
17211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder() {
17311417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle();
17411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
17511417b1cfde8f1749905f2d735623af9214148afJeff Brown
17611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
17711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Creates a media route provider descriptor builder whose initial contents are
17811417b1cfde8f1749905f2d735623af9214148afJeff Brown         * copied from an existing descriptor.
17911417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
18011417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder(MediaRouteProviderDescriptor descriptor) {
18111417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (descriptor == null) {
18211417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("descriptor must not be null");
18311417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
18411417b1cfde8f1749905f2d735623af9214148afJeff Brown
18511417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle = new Bundle(descriptor.mBundle);
18611417b1cfde8f1749905f2d735623af9214148afJeff Brown
18711417b1cfde8f1749905f2d735623af9214148afJeff Brown            descriptor.ensureRoutes();
18811417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!descriptor.mRoutes.isEmpty()) {
18911417b1cfde8f1749905f2d735623af9214148afJeff Brown                mRoutes = new ArrayList<MediaRouteDescriptor>(descriptor.mRoutes);
19011417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
19111417b1cfde8f1749905f2d735623af9214148afJeff Brown
19211417b1cfde8f1749905f2d735623af9214148afJeff Brown            descriptor.ensureDiscoverableControlFilters();
19311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!descriptor.mDiscoverableControlFilters.isEmpty()) {
19411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mDiscoverableControlFilters = new ArrayList<IntentFilter>(
19511417b1cfde8f1749905f2d735623af9214148afJeff Brown                        descriptor.mDiscoverableControlFilters);
19611417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
19711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
19811417b1cfde8f1749905f2d735623af9214148afJeff Brown
19911417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
20011417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a route.
20111417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
20211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addRoute(MediaRouteDescriptor route) {
20311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (route == null) {
20411417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("route must not be null");
20511417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
20611417b1cfde8f1749905f2d735623af9214148afJeff Brown
20711417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mRoutes == null) {
20811417b1cfde8f1749905f2d735623af9214148afJeff Brown                mRoutes = new ArrayList<MediaRouteDescriptor>();
20911417b1cfde8f1749905f2d735623af9214148afJeff Brown            } else if (mRoutes.contains(route)) {
21011417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("route descriptor already added");
21111417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
21211417b1cfde8f1749905f2d735623af9214148afJeff Brown            mRoutes.add(route);
21311417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
21411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
21511417b1cfde8f1749905f2d735623af9214148afJeff Brown
21611417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
21711417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a list of routes.
21811417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
21911417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addRoutes(List<MediaRouteDescriptor> routes) {
22011417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (routes == null) {
22111417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("routes must not be null");
22211417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
22311417b1cfde8f1749905f2d735623af9214148afJeff Brown
22411417b1cfde8f1749905f2d735623af9214148afJeff Brown            final int count = routes.size();
22511417b1cfde8f1749905f2d735623af9214148afJeff Brown            for (int i = 0; i < count; i++) {
22611417b1cfde8f1749905f2d735623af9214148afJeff Brown                addRoute(routes.get(i));
22711417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
22811417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
22911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
23011417b1cfde8f1749905f2d735623af9214148afJeff Brown
23111417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
23211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a {@link MediaControlIntent media control intent} filter.
23311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
23411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addDiscoverableControlFilter(IntentFilter filter) {
23511417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filter == null) {
23611417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filter must not be null");
23711417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
23811417b1cfde8f1749905f2d735623af9214148afJeff Brown
23911417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mDiscoverableControlFilters == null) {
24011417b1cfde8f1749905f2d735623af9214148afJeff Brown                mDiscoverableControlFilters = new ArrayList<IntentFilter>();
24111417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
24211417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (!mDiscoverableControlFilters.contains(filter)) {
24311417b1cfde8f1749905f2d735623af9214148afJeff Brown                mDiscoverableControlFilters.add(filter);
24411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
24511417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
24611417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
24711417b1cfde8f1749905f2d735623af9214148afJeff Brown
24811417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
24911417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Adds a list of {@link MediaControlIntent media control intent} filters.
25011417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
25111417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder addDiscoverableControlFilters(List<IntentFilter> filters) {
25211417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (filters == null) {
25311417b1cfde8f1749905f2d735623af9214148afJeff Brown                throw new IllegalArgumentException("filters must not be null");
25411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
25511417b1cfde8f1749905f2d735623af9214148afJeff Brown
25611417b1cfde8f1749905f2d735623af9214148afJeff Brown            final int count = filters.size();
25711417b1cfde8f1749905f2d735623af9214148afJeff Brown            for (int i = 0; i < count; i++) {
25811417b1cfde8f1749905f2d735623af9214148afJeff Brown                addDiscoverableControlFilter(filters.get(i));
25911417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
26011417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
26111417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
26211417b1cfde8f1749905f2d735623af9214148afJeff Brown
26311417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
26411417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Sets whether the provider requires active scans to discover routes.
26511417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
26611417b1cfde8f1749905f2d735623af9214148afJeff Brown        public Builder setActiveScanRequired(boolean required) {
26711417b1cfde8f1749905f2d735623af9214148afJeff Brown            mBundle.putBoolean(KEY_ACTIVE_SCAN_REQUIRED, required);
26811417b1cfde8f1749905f2d735623af9214148afJeff Brown            return this;
26911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
27011417b1cfde8f1749905f2d735623af9214148afJeff Brown
27111417b1cfde8f1749905f2d735623af9214148afJeff Brown        /**
27211417b1cfde8f1749905f2d735623af9214148afJeff Brown         * Builds the {@link MediaRouteProviderDescriptor media route provider descriptor}.
27311417b1cfde8f1749905f2d735623af9214148afJeff Brown         */
27411417b1cfde8f1749905f2d735623af9214148afJeff Brown        public MediaRouteProviderDescriptor build() {
27511417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mRoutes != null) {
27611417b1cfde8f1749905f2d735623af9214148afJeff Brown                final int count = mRoutes.size();
27711417b1cfde8f1749905f2d735623af9214148afJeff Brown                ArrayList<Bundle> routeBundles = new ArrayList<Bundle>(count);
27811417b1cfde8f1749905f2d735623af9214148afJeff Brown                for (int i = 0; i < count; i++) {
27911417b1cfde8f1749905f2d735623af9214148afJeff Brown                    routeBundles.add(mRoutes.get(i).asBundle());
28011417b1cfde8f1749905f2d735623af9214148afJeff Brown                }
28111417b1cfde8f1749905f2d735623af9214148afJeff Brown                mBundle.putParcelableArrayList(KEY_ROUTES, routeBundles);
28211417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
28311417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mDiscoverableControlFilters != null) {
28411417b1cfde8f1749905f2d735623af9214148afJeff Brown                mBundle.putParcelableArrayList(KEY_DISCOVERABLE_CONTROL_FILTERS,
28511417b1cfde8f1749905f2d735623af9214148afJeff Brown                        mDiscoverableControlFilters);
28611417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
28711417b1cfde8f1749905f2d735623af9214148afJeff Brown            return new MediaRouteProviderDescriptor(mBundle,
28811417b1cfde8f1749905f2d735623af9214148afJeff Brown                    mRoutes, mDiscoverableControlFilters);
28911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
29011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
29111417b1cfde8f1749905f2d735623af9214148afJeff Brown}