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.os.Bundle; 1911417b1cfde8f1749905f2d735623af9214148afJeff Brown 2011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.ArrayList; 2111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.util.Arrays; 227599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brownimport java.util.Collection; 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 { 339c83739aefcb1748551645a656bece0d864cef76Sungsoo Lim static final String KEY_ROUTES = "routes"; 3411417b1cfde8f1749905f2d735623af9214148afJeff Brown 35e2c6a94b6e4aab502f9b88dd3ff664bd90b25839Aurimas Liutikas final Bundle mBundle; 36e2c6a94b6e4aab502f9b88dd3ff664bd90b25839Aurimas Liutikas List<MediaRouteDescriptor> mRoutes; 3711417b1cfde8f1749905f2d735623af9214148afJeff Brown 38e2c6a94b6e4aab502f9b88dd3ff664bd90b25839Aurimas Liutikas MediaRouteProviderDescriptor(Bundle bundle, 39d11aa1784335270b8d85e385f2c8be79ee6a586cJeff Brown List<MediaRouteDescriptor> routes) { 4011417b1cfde8f1749905f2d735623af9214148afJeff Brown mBundle = bundle; 4111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes = routes; 4211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 4311417b1cfde8f1749905f2d735623af9214148afJeff Brown 4411417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 4511417b1cfde8f1749905f2d735623af9214148afJeff Brown * Gets the list of all routes that this provider has published. 4611417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 4711417b1cfde8f1749905f2d735623af9214148afJeff Brown public List<MediaRouteDescriptor> getRoutes() { 4811417b1cfde8f1749905f2d735623af9214148afJeff Brown ensureRoutes(); 4911417b1cfde8f1749905f2d735623af9214148afJeff Brown return mRoutes; 5011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 5111417b1cfde8f1749905f2d735623af9214148afJeff Brown 52e2c6a94b6e4aab502f9b88dd3ff664bd90b25839Aurimas Liutikas void ensureRoutes() { 5311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoutes == null) { 5411417b1cfde8f1749905f2d735623af9214148afJeff Brown ArrayList<Bundle> routeBundles = mBundle.<Bundle>getParcelableArrayList(KEY_ROUTES); 5511417b1cfde8f1749905f2d735623af9214148afJeff Brown if (routeBundles == null || routeBundles.isEmpty()) { 5611417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes = Collections.<MediaRouteDescriptor>emptyList(); 5711417b1cfde8f1749905f2d735623af9214148afJeff Brown } else { 5811417b1cfde8f1749905f2d735623af9214148afJeff Brown final int count = routeBundles.size(); 5911417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes = new ArrayList<MediaRouteDescriptor>(count); 6011417b1cfde8f1749905f2d735623af9214148afJeff Brown for (int i = 0; i < count; i++) { 6111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes.add(MediaRouteDescriptor.fromBundle(routeBundles.get(i))); 6211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 6311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 6411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 6511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 6611417b1cfde8f1749905f2d735623af9214148afJeff Brown 6711417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 6811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Returns true if the route provider descriptor and all of the routes that 6911417b1cfde8f1749905f2d735623af9214148afJeff Brown * it contains have all of the required fields. 7011417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p> 7111417b1cfde8f1749905f2d735623af9214148afJeff Brown * This verification is deep. If the provider descriptor is known to be 7211417b1cfde8f1749905f2d735623af9214148afJeff Brown * valid then it is not necessary to call {@link #isValid} on each of its routes. 7311417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p> 7411417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 7511417b1cfde8f1749905f2d735623af9214148afJeff Brown public boolean isValid() { 7611417b1cfde8f1749905f2d735623af9214148afJeff Brown ensureRoutes(); 7711417b1cfde8f1749905f2d735623af9214148afJeff Brown final int routeCount = mRoutes.size(); 7811417b1cfde8f1749905f2d735623af9214148afJeff Brown for (int i = 0; i < routeCount; i++) { 7911417b1cfde8f1749905f2d735623af9214148afJeff Brown MediaRouteDescriptor route = mRoutes.get(i); 8011417b1cfde8f1749905f2d735623af9214148afJeff Brown if (route == null || !route.isValid()) { 8111417b1cfde8f1749905f2d735623af9214148afJeff Brown return false; 8211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 8311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 8411417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 8511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 8611417b1cfde8f1749905f2d735623af9214148afJeff Brown 8711417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 8811417b1cfde8f1749905f2d735623af9214148afJeff Brown public String toString() { 8911417b1cfde8f1749905f2d735623af9214148afJeff Brown StringBuilder result = new StringBuilder(); 9011417b1cfde8f1749905f2d735623af9214148afJeff Brown result.append("MediaRouteProviderDescriptor{ "); 91d11aa1784335270b8d85e385f2c8be79ee6a586cJeff Brown result.append("routes=").append( 9211417b1cfde8f1749905f2d735623af9214148afJeff Brown Arrays.toString(getRoutes().toArray())); 9311417b1cfde8f1749905f2d735623af9214148afJeff Brown result.append(", isValid=").append(isValid()); 943d4c9459ed77f732dd3ba602713af6ebf9280c8cJeff Brown result.append(" }"); 9511417b1cfde8f1749905f2d735623af9214148afJeff Brown return result.toString(); 9611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 9711417b1cfde8f1749905f2d735623af9214148afJeff Brown 9811417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 9911417b1cfde8f1749905f2d735623af9214148afJeff Brown * Converts this object to a bundle for serialization. 10011417b1cfde8f1749905f2d735623af9214148afJeff Brown * 10111417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The contents of the object represented as a bundle. 10211417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 10311417b1cfde8f1749905f2d735623af9214148afJeff Brown public Bundle asBundle() { 10411417b1cfde8f1749905f2d735623af9214148afJeff Brown return mBundle; 10511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 10611417b1cfde8f1749905f2d735623af9214148afJeff Brown 10711417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 10811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Creates an instance from a bundle. 10911417b1cfde8f1749905f2d735623af9214148afJeff Brown * 11011417b1cfde8f1749905f2d735623af9214148afJeff Brown * @param bundle The bundle, or null if none. 11111417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The new instance, or null if the bundle was null. 11211417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 11311417b1cfde8f1749905f2d735623af9214148afJeff Brown public static MediaRouteProviderDescriptor fromBundle(Bundle bundle) { 114d11aa1784335270b8d85e385f2c8be79ee6a586cJeff Brown return bundle != null ? new MediaRouteProviderDescriptor(bundle, null) : null; 11511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 11611417b1cfde8f1749905f2d735623af9214148afJeff Brown 11711417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 11811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Builder for {@link MediaRouteProviderDescriptor media route provider descriptors}. 11911417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 12011417b1cfde8f1749905f2d735623af9214148afJeff Brown public static final class Builder { 12111417b1cfde8f1749905f2d735623af9214148afJeff Brown private final Bundle mBundle; 12211417b1cfde8f1749905f2d735623af9214148afJeff Brown private ArrayList<MediaRouteDescriptor> mRoutes; 12311417b1cfde8f1749905f2d735623af9214148afJeff Brown 12411417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 12511417b1cfde8f1749905f2d735623af9214148afJeff Brown * Creates an empty media route provider descriptor builder. 12611417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 12711417b1cfde8f1749905f2d735623af9214148afJeff Brown public Builder() { 12811417b1cfde8f1749905f2d735623af9214148afJeff Brown mBundle = new Bundle(); 12911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13011417b1cfde8f1749905f2d735623af9214148afJeff Brown 13111417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 13211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Creates a media route provider descriptor builder whose initial contents are 13311417b1cfde8f1749905f2d735623af9214148afJeff Brown * copied from an existing descriptor. 13411417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 13511417b1cfde8f1749905f2d735623af9214148afJeff Brown public Builder(MediaRouteProviderDescriptor descriptor) { 13611417b1cfde8f1749905f2d735623af9214148afJeff Brown if (descriptor == null) { 13711417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new IllegalArgumentException("descriptor must not be null"); 13811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13911417b1cfde8f1749905f2d735623af9214148afJeff Brown 14011417b1cfde8f1749905f2d735623af9214148afJeff Brown mBundle = new Bundle(descriptor.mBundle); 14111417b1cfde8f1749905f2d735623af9214148afJeff Brown 14211417b1cfde8f1749905f2d735623af9214148afJeff Brown descriptor.ensureRoutes(); 14311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (!descriptor.mRoutes.isEmpty()) { 14411417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes = new ArrayList<MediaRouteDescriptor>(descriptor.mRoutes); 14511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 14611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 14711417b1cfde8f1749905f2d735623af9214148afJeff Brown 14811417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 14911417b1cfde8f1749905f2d735623af9214148afJeff Brown * Adds a route. 15011417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 15111417b1cfde8f1749905f2d735623af9214148afJeff Brown public Builder addRoute(MediaRouteDescriptor route) { 15211417b1cfde8f1749905f2d735623af9214148afJeff Brown if (route == null) { 15311417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new IllegalArgumentException("route must not be null"); 15411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 15511417b1cfde8f1749905f2d735623af9214148afJeff Brown 15611417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoutes == null) { 15711417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes = new ArrayList<MediaRouteDescriptor>(); 15811417b1cfde8f1749905f2d735623af9214148afJeff Brown } else if (mRoutes.contains(route)) { 15911417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new IllegalArgumentException("route descriptor already added"); 16011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 16111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoutes.add(route); 16211417b1cfde8f1749905f2d735623af9214148afJeff Brown return this; 16311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 16411417b1cfde8f1749905f2d735623af9214148afJeff Brown 16511417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 16611417b1cfde8f1749905f2d735623af9214148afJeff Brown * Adds a list of routes. 16711417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 1687599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown public Builder addRoutes(Collection<MediaRouteDescriptor> routes) { 16911417b1cfde8f1749905f2d735623af9214148afJeff Brown if (routes == null) { 17011417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new IllegalArgumentException("routes must not be null"); 17111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 17211417b1cfde8f1749905f2d735623af9214148afJeff Brown 1737599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown if (!routes.isEmpty()) { 1747599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown for (MediaRouteDescriptor route : routes) { 1757599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown addRoute(route); 1767599feee523c7b7d33576ae5825e43e3d62cbcbeJeff Brown } 17711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 17811417b1cfde8f1749905f2d735623af9214148afJeff Brown return this; 17911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 18011417b1cfde8f1749905f2d735623af9214148afJeff Brown 18111417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 18211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Builds the {@link MediaRouteProviderDescriptor media route provider descriptor}. 18311417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 18411417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouteProviderDescriptor build() { 18511417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoutes != null) { 18611417b1cfde8f1749905f2d735623af9214148afJeff Brown final int count = mRoutes.size(); 18711417b1cfde8f1749905f2d735623af9214148afJeff Brown ArrayList<Bundle> routeBundles = new ArrayList<Bundle>(count); 18811417b1cfde8f1749905f2d735623af9214148afJeff Brown for (int i = 0; i < count; i++) { 18911417b1cfde8f1749905f2d735623af9214148afJeff Brown routeBundles.add(mRoutes.get(i).asBundle()); 19011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19111417b1cfde8f1749905f2d735623af9214148afJeff Brown mBundle.putParcelableArrayList(KEY_ROUTES, routeBundles); 19211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 193d11aa1784335270b8d85e385f2c8be79ee6a586cJeff Brown return new MediaRouteProviderDescriptor(mBundle, mRoutes); 19411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19611417b1cfde8f1749905f2d735623af9214148afJeff Brown}