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}