blob: f11b70ebbf71a85ce7edd28f0be87dbe27fcf962 [file] [log] [blame]
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +00001/*
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
17package com.android.server.media;
18
19import android.annotation.NonNull;
20import android.annotation.Nullable;
21import android.content.ComponentName;
22import android.content.Intent;
23import android.media.MediaRoute2Info;
24import android.media.MediaRoute2ProviderInfo;
Hyundo Moon63a05402019-12-19 20:13:56 +090025import android.media.RouteSessionInfo;
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000026
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090027import java.util.ArrayList;
28import java.util.Collections;
29import java.util.List;
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000030import java.util.Objects;
31
32abstract class MediaRoute2Provider {
33 final ComponentName mComponentName;
34 final String mUniqueId;
35
Kyunglyul Hyunf7d5e042019-11-11 13:56:28 +090036 Callback mCallback;
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090037 private volatile MediaRoute2ProviderInfo mProviderInfo;
38 private volatile List<RouteSessionInfo> mSessionInfos = Collections.emptyList();
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000039
40 MediaRoute2Provider(@NonNull ComponentName componentName) {
41 mComponentName = Objects.requireNonNull(componentName, "Component name must not be null.");
42 mUniqueId = componentName.flattenToShortString();
43 }
44
45 public void setCallback(MediaRoute2ProviderProxy.Callback callback) {
46 mCallback = callback;
47 }
48
Hyundo Moon63a05402019-12-19 20:13:56 +090049 public abstract void requestCreateSession(String packageName, String routeId,
Kyunglyul Hyunc7847242019-12-30 17:46:04 +090050 String controlCategory, long requestId);
Kyunglyul Hyuncb8894d2019-12-27 14:24:46 +090051 public abstract void releaseSession(int sessionId);
52
Hyundo Moon9be35482019-12-30 17:33:13 +090053 public abstract void selectRoute(int sessionId, MediaRoute2Info route);
54 public abstract void deselectRoute(int sessionId, MediaRoute2Info route);
Hyundo Moon0a926572019-12-28 15:01:21 +090055 public abstract void transferToRoute(int sessionId, MediaRoute2Info route);
Kyunglyul Hyuncb8894d2019-12-27 14:24:46 +090056
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000057 public abstract void sendControlRequest(MediaRoute2Info route, Intent request);
58 public abstract void requestSetVolume(MediaRoute2Info route, int volume);
59 public abstract void requestUpdateVolume(MediaRoute2Info route, int delta);
60
61 @NonNull
62 public String getUniqueId() {
63 return mUniqueId;
64 }
65
66 @Nullable
67 public MediaRoute2ProviderInfo getProviderInfo() {
68 return mProviderInfo;
69 }
70
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090071 @NonNull
72 public List<RouteSessionInfo> getSessionInfos() {
73 return mSessionInfos;
74 }
75
76 void setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo,
77 List<RouteSessionInfo> sessionInfos) {
78 if (providerInfo == null) {
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000079 mProviderInfo = null;
80 } else {
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090081 mProviderInfo = new MediaRoute2ProviderInfo.Builder(providerInfo)
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000082 .setUniqueId(mUniqueId)
83 .build();
84 }
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090085 List<RouteSessionInfo> sessionInfoWithProviderId = new ArrayList<RouteSessionInfo>();
86 for (RouteSessionInfo sessionInfo : sessionInfos) {
87 sessionInfoWithProviderId.add(
88 new RouteSessionInfo.Builder(sessionInfo)
89 .setProviderId(mUniqueId)
90 .build());
91 }
92 mSessionInfos = sessionInfoWithProviderId;
93
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000094 if (mCallback != null) {
95 mCallback.onProviderStateChanged(this);
96 }
97 }
98
99 public boolean hasComponentName(String packageName, String className) {
100 return mComponentName.getPackageName().equals(packageName)
101 && mComponentName.getClassName().equals(className);
102 }
103
104 public interface Callback {
Kyunglyul Hyunf7d5e042019-11-11 13:56:28 +0900105 void onProviderStateChanged(@Nullable MediaRoute2Provider provider);
Hyundo Moon63a05402019-12-19 20:13:56 +0900106 void onSessionCreated(@NonNull MediaRoute2Provider provider,
Kyunglyul Hyunc7847242019-12-30 17:46:04 +0900107 @Nullable RouteSessionInfo sessionInfo, long requestId);
Hyundo Moon0a926572019-12-28 15:01:21 +0900108 // TODO: Remove this when MediaRouter2ServiceImpl notifies clients of session changes.
109 void onSessionInfoChanged(@NonNull MediaRoute2Provider provider,
110 @NonNull RouteSessionInfo sessionInfo);
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +0000111 }
112}