blob: 9c9a4121830f3bbdda1c71e6b033b81f17835017 [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;
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000023import android.media.MediaRoute2ProviderInfo;
Hyundo Moon63a05402019-12-19 20:13:56 +090024import android.media.RouteSessionInfo;
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000025
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090026import java.util.ArrayList;
27import java.util.Collections;
28import java.util.List;
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000029import java.util.Objects;
30
31abstract class MediaRoute2Provider {
32 final ComponentName mComponentName;
33 final String mUniqueId;
34
Kyunglyul Hyunf7d5e042019-11-11 13:56:28 +090035 Callback mCallback;
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090036 private volatile MediaRoute2ProviderInfo mProviderInfo;
37 private volatile List<RouteSessionInfo> mSessionInfos = Collections.emptyList();
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000038
39 MediaRoute2Provider(@NonNull ComponentName componentName) {
40 mComponentName = Objects.requireNonNull(componentName, "Component name must not be null.");
41 mUniqueId = componentName.flattenToShortString();
42 }
43
44 public void setCallback(MediaRoute2ProviderProxy.Callback callback) {
45 mCallback = callback;
46 }
47
Hyundo Moon63a05402019-12-19 20:13:56 +090048 public abstract void requestCreateSession(String packageName, String routeId,
Kyunglyul Hyun91c792e2020-01-08 13:51:27 +090049 String routeType, long requestId);
Hyundo Moonb26c4b22020-01-08 19:44:43 +090050 public abstract void releaseSession(String sessionId);
Kyunglyul Hyuncb8894d2019-12-27 14:24:46 +090051
Hyundo Moonb26c4b22020-01-08 19:44:43 +090052 public abstract void selectRoute(String sessionId, String routeId);
53 public abstract void deselectRoute(String sessionId, String routeId);
54 public abstract void transferToRoute(String sessionId, String routeId);
Kyunglyul Hyuncb8894d2019-12-27 14:24:46 +090055
Hyundo Moonb7dc0822020-01-07 16:49:31 +090056 public abstract void sendControlRequest(String routeId, Intent request);
57 public abstract void requestSetVolume(String routeId, int volume);
58 public abstract void requestUpdateVolume(String routeId, int delta);
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000059
60 @NonNull
61 public String getUniqueId() {
62 return mUniqueId;
63 }
64
65 @Nullable
66 public MediaRoute2ProviderInfo getProviderInfo() {
67 return mProviderInfo;
68 }
69
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090070 @NonNull
71 public List<RouteSessionInfo> getSessionInfos() {
72 return mSessionInfos;
73 }
74
75 void setAndNotifyProviderState(MediaRoute2ProviderInfo providerInfo,
76 List<RouteSessionInfo> sessionInfos) {
77 if (providerInfo == null) {
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000078 mProviderInfo = null;
79 } else {
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090080 mProviderInfo = new MediaRoute2ProviderInfo.Builder(providerInfo)
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000081 .setUniqueId(mUniqueId)
82 .build();
83 }
Kyunglyul Hyunefe43742019-12-31 18:32:28 +090084 List<RouteSessionInfo> sessionInfoWithProviderId = new ArrayList<RouteSessionInfo>();
85 for (RouteSessionInfo sessionInfo : sessionInfos) {
86 sessionInfoWithProviderId.add(
87 new RouteSessionInfo.Builder(sessionInfo)
88 .setProviderId(mUniqueId)
89 .build());
90 }
91 mSessionInfos = sessionInfoWithProviderId;
92
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +000093 if (mCallback != null) {
94 mCallback.onProviderStateChanged(this);
95 }
96 }
97
98 public boolean hasComponentName(String packageName, String className) {
99 return mComponentName.getPackageName().equals(packageName)
100 && mComponentName.getClassName().equals(className);
101 }
102
103 public interface Callback {
Kyunglyul Hyunf7d5e042019-11-11 13:56:28 +0900104 void onProviderStateChanged(@Nullable MediaRoute2Provider provider);
Hyundo Moon63a05402019-12-19 20:13:56 +0900105 void onSessionCreated(@NonNull MediaRoute2Provider provider,
Kyunglyul Hyunc7847242019-12-30 17:46:04 +0900106 @Nullable RouteSessionInfo sessionInfo, long requestId);
Hyundo Moon0a926572019-12-28 15:01:21 +0900107 // TODO: Remove this when MediaRouter2ServiceImpl notifies clients of session changes.
108 void onSessionInfoChanged(@NonNull MediaRoute2Provider provider,
109 @NonNull RouteSessionInfo sessionInfo);
Hyundo Moonca9db782020-01-01 18:31:15 +0900110 // TODO: Call this when service actually notifies of session release.
111 void onSessionReleased(@NonNull MediaRoute2Provider provider,
112 @NonNull RouteSessionInfo sessionInfo);
Kyunglyul Hyun0332e9a22019-11-20 01:39:25 +0000113 }
114}