• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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