1 /* 2 * Copyright 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.media; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.content.ComponentName; 22 import android.media.MediaRoute2Info; 23 import android.media.MediaRoute2ProviderInfo; 24 import android.media.RouteDiscoveryPreference; 25 import android.media.RoutingSessionInfo; 26 import android.os.Bundle; 27 28 import com.android.internal.annotations.GuardedBy; 29 30 import java.io.PrintWriter; 31 import java.util.ArrayList; 32 import java.util.List; 33 import java.util.Objects; 34 import java.util.Set; 35 36 abstract class MediaRoute2Provider { 37 final ComponentName mComponentName; 38 final String mUniqueId; 39 final Object mLock = new Object(); 40 41 Callback mCallback; 42 boolean mIsSystemRouteProvider; 43 private volatile MediaRoute2ProviderInfo mProviderInfo; 44 45 @GuardedBy("mLock") 46 final List<RoutingSessionInfo> mSessionInfos = new ArrayList<>(); 47 MediaRoute2Provider(@onNull ComponentName componentName)48 MediaRoute2Provider(@NonNull ComponentName componentName) { 49 mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); 50 mUniqueId = componentName.flattenToShortString(); 51 } 52 setCallback(Callback callback)53 public void setCallback(Callback callback) { 54 mCallback = callback; 55 } 56 requestCreateSession(long requestId, String packageName, String routeId, @Nullable Bundle sessionHints)57 public abstract void requestCreateSession(long requestId, String packageName, String routeId, 58 @Nullable Bundle sessionHints); releaseSession(long requestId, String sessionId)59 public abstract void releaseSession(long requestId, String sessionId); 60 updateDiscoveryPreference( Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference)61 public abstract void updateDiscoveryPreference( 62 Set<String> activelyScanningPackages, RouteDiscoveryPreference discoveryPreference); 63 selectRoute(long requestId, String sessionId, String routeId)64 public abstract void selectRoute(long requestId, String sessionId, String routeId); deselectRoute(long requestId, String sessionId, String routeId)65 public abstract void deselectRoute(long requestId, String sessionId, String routeId); transferToRoute(long requestId, String sessionId, String routeId)66 public abstract void transferToRoute(long requestId, String sessionId, String routeId); 67 setRouteVolume(long requestId, String routeId, int volume)68 public abstract void setRouteVolume(long requestId, String routeId, int volume); setSessionVolume(long requestId, String sessionId, int volume)69 public abstract void setSessionVolume(long requestId, String sessionId, int volume); prepareReleaseSession(@onNull String sessionId)70 public abstract void prepareReleaseSession(@NonNull String sessionId); 71 72 @NonNull getUniqueId()73 public String getUniqueId() { 74 return mUniqueId; 75 } 76 77 @Nullable getProviderInfo()78 public MediaRoute2ProviderInfo getProviderInfo() { 79 return mProviderInfo; 80 } 81 82 @NonNull getSessionInfos()83 public List<RoutingSessionInfo> getSessionInfos() { 84 synchronized (mLock) { 85 return new ArrayList<>(mSessionInfos); 86 } 87 } 88 setProviderState(MediaRoute2ProviderInfo providerInfo)89 void setProviderState(MediaRoute2ProviderInfo providerInfo) { 90 if (providerInfo == null) { 91 mProviderInfo = null; 92 } else { 93 mProviderInfo = new MediaRoute2ProviderInfo.Builder(providerInfo) 94 .setUniqueId(mComponentName.getPackageName(), mUniqueId) 95 .setSystemRouteProvider(mIsSystemRouteProvider) 96 .build(); 97 } 98 } 99 notifyProviderState()100 void notifyProviderState() { 101 if (mCallback != null) { 102 mCallback.onProviderStateChanged(this); 103 } 104 } 105 setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo)106 void setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo) { 107 setProviderState(providerInfo); 108 notifyProviderState(); 109 } 110 hasComponentName(String packageName, String className)111 public boolean hasComponentName(String packageName, String className) { 112 return mComponentName.getPackageName().equals(packageName) 113 && mComponentName.getClassName().equals(className); 114 } 115 dump(PrintWriter pw, String prefix)116 public void dump(PrintWriter pw, String prefix) { 117 pw.println(prefix + getDebugString()); 118 prefix += " "; 119 if (mProviderInfo == null) { 120 pw.println(prefix + "<provider info not received, yet>"); 121 } else if (mProviderInfo.getRoutes().isEmpty()) { 122 pw.println(prefix + "<provider info has no routes>"); 123 } else { 124 for (MediaRoute2Info route : mProviderInfo.getRoutes()) { 125 pw.printf("%s%s | %s\n", prefix, route.getId(), route.getName()); 126 } 127 } 128 } 129 130 @Override toString()131 public String toString() { 132 return getDebugString(); 133 } 134 135 /** Returns a human-readable string describing the instance, for debugging purposes. */ getDebugString()136 protected abstract String getDebugString(); 137 138 public interface Callback { onProviderStateChanged(@ullable MediaRoute2Provider provider)139 void onProviderStateChanged(@Nullable MediaRoute2Provider provider); onSessionCreated(@onNull MediaRoute2Provider provider, long requestId, @Nullable RoutingSessionInfo sessionInfo)140 void onSessionCreated(@NonNull MediaRoute2Provider provider, 141 long requestId, @Nullable RoutingSessionInfo sessionInfo); onSessionUpdated(@onNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo)142 void onSessionUpdated(@NonNull MediaRoute2Provider provider, 143 @NonNull RoutingSessionInfo sessionInfo); onSessionReleased(@onNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo)144 void onSessionReleased(@NonNull MediaRoute2Provider provider, 145 @NonNull RoutingSessionInfo sessionInfo); onRequestFailed(@onNull MediaRoute2Provider provider, long requestId, int reason)146 void onRequestFailed(@NonNull MediaRoute2Provider provider, long requestId, int reason); 147 } 148 } 149