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.MediaRoute2ProviderInfo; 23 import android.media.RouteDiscoveryPreference; 24 import android.media.RoutingSessionInfo; 25 import android.os.Bundle; 26 27 import com.android.internal.annotations.GuardedBy; 28 29 import java.util.ArrayList; 30 import java.util.List; 31 import java.util.Objects; 32 33 abstract class MediaRoute2Provider { 34 final ComponentName mComponentName; 35 final String mUniqueId; 36 final Object mLock = new Object(); 37 38 Callback mCallback; 39 boolean mIsSystemRouteProvider; 40 private volatile MediaRoute2ProviderInfo mProviderInfo; 41 42 @GuardedBy("mLock") 43 final List<RoutingSessionInfo> mSessionInfos = new ArrayList<>(); 44 MediaRoute2Provider(@onNull ComponentName componentName)45 MediaRoute2Provider(@NonNull ComponentName componentName) { 46 mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); 47 mUniqueId = componentName.flattenToShortString(); 48 } 49 setCallback(Callback callback)50 public void setCallback(Callback callback) { 51 mCallback = callback; 52 } 53 requestCreateSession(long requestId, String packageName, String routeId, @Nullable Bundle sessionHints)54 public abstract void requestCreateSession(long requestId, String packageName, String routeId, 55 @Nullable Bundle sessionHints); releaseSession(long requestId, String sessionId)56 public abstract void releaseSession(long requestId, String sessionId); updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference)57 public abstract void updateDiscoveryPreference(RouteDiscoveryPreference discoveryPreference); 58 selectRoute(long requestId, String sessionId, String routeId)59 public abstract void selectRoute(long requestId, String sessionId, String routeId); deselectRoute(long requestId, String sessionId, String routeId)60 public abstract void deselectRoute(long requestId, String sessionId, String routeId); transferToRoute(long requestId, String sessionId, String routeId)61 public abstract void transferToRoute(long requestId, String sessionId, String routeId); 62 setRouteVolume(long requestId, String routeId, int volume)63 public abstract void setRouteVolume(long requestId, String routeId, int volume); setSessionVolume(long requestId, String sessionId, int volume)64 public abstract void setSessionVolume(long requestId, String sessionId, int volume); prepareReleaseSession(@onNull String sessionId)65 public abstract void prepareReleaseSession(@NonNull String sessionId); 66 67 @NonNull getUniqueId()68 public String getUniqueId() { 69 return mUniqueId; 70 } 71 72 @Nullable getProviderInfo()73 public MediaRoute2ProviderInfo getProviderInfo() { 74 return mProviderInfo; 75 } 76 77 @NonNull getSessionInfos()78 public List<RoutingSessionInfo> getSessionInfos() { 79 synchronized (mLock) { 80 return new ArrayList<>(mSessionInfos); 81 } 82 } 83 setProviderState(MediaRoute2ProviderInfo providerInfo)84 void setProviderState(MediaRoute2ProviderInfo providerInfo) { 85 if (providerInfo == null) { 86 mProviderInfo = null; 87 } else { 88 mProviderInfo = new MediaRoute2ProviderInfo.Builder(providerInfo) 89 .setUniqueId(mComponentName.getPackageName(), mUniqueId) 90 .setSystemRouteProvider(mIsSystemRouteProvider) 91 .build(); 92 } 93 } 94 notifyProviderState()95 void notifyProviderState() { 96 if (mCallback != null) { 97 mCallback.onProviderStateChanged(this); 98 } 99 } 100 setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo)101 void setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo) { 102 setProviderState(providerInfo); 103 notifyProviderState(); 104 } 105 hasComponentName(String packageName, String className)106 public boolean hasComponentName(String packageName, String className) { 107 return mComponentName.getPackageName().equals(packageName) 108 && mComponentName.getClassName().equals(className); 109 } 110 111 public interface Callback { onProviderStateChanged(@ullable MediaRoute2Provider provider)112 void onProviderStateChanged(@Nullable MediaRoute2Provider provider); onSessionCreated(@onNull MediaRoute2Provider provider, long requestId, @Nullable RoutingSessionInfo sessionInfo)113 void onSessionCreated(@NonNull MediaRoute2Provider provider, 114 long requestId, @Nullable RoutingSessionInfo sessionInfo); onSessionUpdated(@onNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo)115 void onSessionUpdated(@NonNull MediaRoute2Provider provider, 116 @NonNull RoutingSessionInfo sessionInfo); onSessionReleased(@onNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo)117 void onSessionReleased(@NonNull MediaRoute2Provider provider, 118 @NonNull RoutingSessionInfo sessionInfo); onRequestFailed(@onNull MediaRoute2Provider provider, long requestId, int reason)119 void onRequestFailed(@NonNull MediaRoute2Provider provider, long requestId, int reason); 120 } 121 } 122