| /* |
| * Copyright 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.media; |
| |
| import android.annotation.NonNull; |
| import android.annotation.Nullable; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| import android.text.TextUtils; |
| import android.util.ArrayMap; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Map; |
| import java.util.Objects; |
| |
| /** |
| * Describes the state of a media router provider and the routes that it publishes. |
| * @hide |
| */ |
| public final class MediaRoute2ProviderInfo implements Parcelable { |
| @NonNull |
| public static final Creator<MediaRoute2ProviderInfo> CREATOR = |
| new Creator<MediaRoute2ProviderInfo>() { |
| @Override |
| public MediaRoute2ProviderInfo createFromParcel(Parcel in) { |
| return new MediaRoute2ProviderInfo(in); |
| } |
| @Override |
| public MediaRoute2ProviderInfo[] newArray(int size) { |
| return new MediaRoute2ProviderInfo[size]; |
| } |
| }; |
| |
| @Nullable |
| final String mUniqueId; |
| @NonNull |
| final ArrayMap<String, MediaRoute2Info> mRoutes; |
| |
| MediaRoute2ProviderInfo(@NonNull Builder builder) { |
| Objects.requireNonNull(builder, "builder must not be null."); |
| |
| mUniqueId = builder.mUniqueId; |
| mRoutes = builder.mRoutes; |
| } |
| |
| MediaRoute2ProviderInfo(@NonNull Parcel src) { |
| mUniqueId = src.readString(); |
| ArrayMap<String, MediaRoute2Info> routes = src.createTypedArrayMap(MediaRoute2Info.CREATOR); |
| mRoutes = (routes == null) ? ArrayMap.EMPTY : routes; |
| } |
| |
| /** |
| * Returns true if the information of the provider and all of it's routes have all |
| * of the required fields. |
| * @hide |
| */ |
| public boolean isValid() { |
| if (mUniqueId == null) { |
| return false; |
| } |
| final int count = mRoutes.size(); |
| for (int i = 0; i < count; i++) { |
| MediaRoute2Info route = mRoutes.valueAt(i); |
| if (route == null || !route.isValid()) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| /** |
| * @hide |
| */ |
| @Nullable |
| public String getUniqueId() { |
| return mUniqueId; |
| } |
| |
| /** |
| * Gets the route for the given route id or null if no matching route exists. |
| * Please note that id should be original id. |
| * |
| * @see MediaRoute2Info#getOriginalId() |
| */ |
| @Nullable |
| public MediaRoute2Info getRoute(@NonNull String routeId) { |
| return mRoutes.get(Objects.requireNonNull(routeId, "routeId must not be null")); |
| } |
| |
| /** |
| * Gets the unmodifiable list of all routes that this provider has published. |
| */ |
| @NonNull |
| public Collection<MediaRoute2Info> getRoutes() { |
| return mRoutes.values(); |
| } |
| |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| @Override |
| public void writeToParcel(@NonNull Parcel dest, int flags) { |
| dest.writeString(mUniqueId); |
| dest.writeTypedArrayMap(mRoutes, flags); |
| } |
| |
| @Override |
| public String toString() { |
| StringBuilder result = new StringBuilder() |
| .append("MediaRouteProviderInfo { ") |
| .append("uniqueId=").append(mUniqueId) |
| .append(", routes=").append(Arrays.toString(getRoutes().toArray())) |
| .append(" }"); |
| return result.toString(); |
| } |
| |
| /** |
| * Builder for {@link MediaRoute2ProviderInfo media route provider info}. |
| */ |
| public static final class Builder { |
| @NonNull |
| final ArrayMap<String, MediaRoute2Info> mRoutes; |
| String mUniqueId; |
| |
| public Builder() { |
| mRoutes = new ArrayMap<>(); |
| } |
| |
| public Builder(@NonNull MediaRoute2ProviderInfo descriptor) { |
| Objects.requireNonNull(descriptor, "descriptor must not be null"); |
| |
| mUniqueId = descriptor.mUniqueId; |
| mRoutes = new ArrayMap<>(descriptor.mRoutes); |
| } |
| |
| /** |
| * Sets the package name and unique id of the provider info. |
| * <p> |
| * The unique id is automatically set by |
| * {@link com.android.server.media.MediaRouterService} and used to identify providers. |
| * The id set by {@link MediaRoute2ProviderService} will be ignored. |
| * </p> |
| * @hide |
| */ |
| @NonNull |
| public Builder setUniqueId(@Nullable String packageName, @Nullable String uniqueId) { |
| if (TextUtils.equals(mUniqueId, uniqueId)) { |
| return this; |
| } |
| mUniqueId = uniqueId; |
| |
| final ArrayMap<String, MediaRoute2Info> newRoutes = new ArrayMap<>(); |
| for (Map.Entry<String, MediaRoute2Info> entry : mRoutes.entrySet()) { |
| MediaRoute2Info routeWithProviderId = new MediaRoute2Info.Builder(entry.getValue()) |
| .setPackageName(packageName) |
| .setProviderId(mUniqueId) |
| .build(); |
| newRoutes.put(routeWithProviderId.getOriginalId(), routeWithProviderId); |
| } |
| |
| mRoutes.clear(); |
| mRoutes.putAll(newRoutes); |
| return this; |
| } |
| |
| /** |
| * Sets whether the provider provides system routes or not |
| */ |
| @NonNull |
| public Builder setSystemRouteProvider(boolean isSystem) { |
| int count = mRoutes.size(); |
| for (int i = 0; i < count; i++) { |
| MediaRoute2Info route = mRoutes.valueAt(i); |
| if (route.isSystemRoute() != isSystem) { |
| mRoutes.setValueAt(i, new MediaRoute2Info.Builder(route) |
| .setSystemRoute(isSystem) |
| .build()); |
| } |
| } |
| return this; |
| } |
| |
| /** |
| * Adds a route to the provider |
| */ |
| @NonNull |
| public Builder addRoute(@NonNull MediaRoute2Info route) { |
| Objects.requireNonNull(route, "route must not be null"); |
| |
| if (mRoutes.containsKey(route.getOriginalId())) { |
| throw new IllegalArgumentException("A route with the same id is already added"); |
| } |
| if (mUniqueId != null) { |
| mRoutes.put(route.getOriginalId(), |
| new MediaRoute2Info.Builder(route).setProviderId(mUniqueId).build()); |
| } else { |
| mRoutes.put(route.getOriginalId(), route); |
| } |
| return this; |
| } |
| |
| /** |
| * Adds a list of routes to the provider |
| */ |
| @NonNull |
| public Builder addRoutes(@NonNull Collection<MediaRoute2Info> routes) { |
| Objects.requireNonNull(routes, "routes must not be null"); |
| |
| if (!routes.isEmpty()) { |
| for (MediaRoute2Info route : routes) { |
| addRoute(route); |
| } |
| } |
| return this; |
| } |
| |
| /** |
| * Builds {@link MediaRoute2ProviderInfo media route provider info}. |
| */ |
| @NonNull |
| public MediaRoute2ProviderInfo build() { |
| return new MediaRoute2ProviderInfo(this); |
| } |
| } |
| } |