1 /*
2  * Copyright 2022 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.example.androidx.mediarouting.data;
18 
19 import android.media.AudioManager;
20 
21 import androidx.mediarouter.media.MediaRouter;
22 
23 import org.jspecify.annotations.NonNull;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.UUID;
28 
29 /** RouteItem helps keep track of the current app controlled routes. */
30 public final class RouteItem {
31 
32     private String mId;
33     private String mName;
34     private String mDescription;
35     private ControlFilter mControlFilter;
36     private PlaybackStream mPlaybackStream;
37     private PlaybackType mPlaybackType;
38     private boolean mCanDisconnect;
39     private VolumeHandling mVolumeHandling;
40     private int mVolume;
41     private int mVolumeMax;
42     private DeviceType mDeviceType;
43     private List<String> mGroupMemberIds;
44     private boolean mIsSenderDriven;
45 
RouteItem()46     public RouteItem() {
47         this.mId = UUID.randomUUID().toString();
48         this.mName = "";
49         this.mDescription = "";
50         this.mControlFilter = ControlFilter.BASIC;
51         this.mPlaybackStream = PlaybackStream.MUSIC;
52         this.mPlaybackType = PlaybackType.REMOTE;
53         this.mVolumeHandling = VolumeHandling.FIXED;
54         this.mVolume = 5;
55         this.mVolumeMax = 25;
56         this.mDeviceType = DeviceType.UNKNOWN;
57         this.mCanDisconnect = false;
58         this.mGroupMemberIds = new ArrayList<>();
59         this.mIsSenderDriven = false;
60     }
61 
RouteItem( @onNull String id, @NonNull String name, @NonNull String description, @NonNull ControlFilter controlFilter, @NonNull PlaybackStream playbackStream, @NonNull PlaybackType playbackType, boolean canDisconnect, @NonNull VolumeHandling volumeHandling, int volume, int volumeMax, @NonNull DeviceType deviceType, @NonNull List<String> groupMemberIds, boolean isSenderDriven)62     public RouteItem(
63             @NonNull String id,
64             @NonNull String name,
65             @NonNull String description,
66             @NonNull ControlFilter controlFilter,
67             @NonNull PlaybackStream playbackStream,
68             @NonNull PlaybackType playbackType,
69             boolean canDisconnect,
70             @NonNull VolumeHandling volumeHandling,
71             int volume,
72             int volumeMax,
73             @NonNull DeviceType deviceType,
74             @NonNull List<String> groupMemberIds,
75             boolean isSenderDriven) {
76         mId = id;
77         mName = name;
78         mDescription = description;
79         mControlFilter = controlFilter;
80         mPlaybackStream = playbackStream;
81         mPlaybackType = playbackType;
82         mCanDisconnect = canDisconnect;
83         mVolumeHandling = volumeHandling;
84         mVolume = volume;
85         mVolumeMax = volumeMax;
86         mDeviceType = deviceType;
87         mGroupMemberIds = groupMemberIds;
88         mIsSenderDriven = isSenderDriven;
89     }
90 
91     /** Returns a deep copy of an existing {@link RouteItem}. */
copyOf(@onNull RouteItem routeItem)92     public static @NonNull RouteItem copyOf(@NonNull RouteItem routeItem) {
93         return new RouteItem(
94                 routeItem.getId(),
95                 routeItem.getName(),
96                 routeItem.getDescription(),
97                 routeItem.getControlFilter(),
98                 routeItem.getPlaybackStream(),
99                 routeItem.getPlaybackType(),
100                 routeItem.isCanDisconnect(),
101                 routeItem.getVolumeHandling(),
102                 routeItem.getVolume(),
103                 routeItem.getVolumeMax(),
104                 routeItem.getDeviceType(),
105                 routeItem.getGroupMemberIds(),
106                 routeItem.isSenderDriven());
107     }
108 
109     public enum ControlFilter {
110         BASIC,
111         QUEUE,
112         SESSION;
113     }
114 
115     public enum PlaybackStream {
116         ACCESSIBILITY(AudioManager.STREAM_ACCESSIBILITY),
117         ALARM(AudioManager.STREAM_ALARM),
118         DTMF(AudioManager.STREAM_DTMF),
119         MUSIC(AudioManager.STREAM_MUSIC),
120         NOTIFICATION(AudioManager.STREAM_NOTIFICATION),
121         RING(AudioManager.STREAM_RING),
122         SYSTEM(AudioManager.STREAM_SYSTEM),
123         VOICE_CALL(AudioManager.STREAM_VOICE_CALL);
124 
125         public final int mIntConstant;
126 
PlaybackStream(int intConstant)127         PlaybackStream(int intConstant) {
128             mIntConstant = intConstant;
129         }
130     }
131 
132     public enum PlaybackType {
133         LOCAL(MediaRouter.RouteInfo.PLAYBACK_TYPE_LOCAL),
134         REMOTE(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE);
135 
136         public final int mIntConstant;
137 
PlaybackType(int intConstant)138         PlaybackType(int intConstant) {
139             mIntConstant = intConstant;
140         }
141     }
142 
143     public enum VolumeHandling {
144         FIXED(MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED),
145         VARIABLE(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE);
146 
147         public final int mIntConstant;
148 
VolumeHandling(int intConstant)149         VolumeHandling(int intConstant) {
150             mIntConstant = intConstant;
151         }
152     }
153 
154     public enum DeviceType {
155         TV(MediaRouter.RouteInfo.DEVICE_TYPE_TV),
156         SPEAKER(MediaRouter.RouteInfo.DEVICE_TYPE_REMOTE_SPEAKER),
157         BLUETOOTH(MediaRouter.RouteInfo.DEVICE_TYPE_BLUETOOTH_A2DP),
158         AUDIO_VIDEO_RECEIVER(MediaRouter.RouteInfo.DEVICE_TYPE_AUDIO_VIDEO_RECEIVER),
159         TABLET(MediaRouter.RouteInfo.DEVICE_TYPE_TABLET),
160         TABLET_DOCKED(MediaRouter.RouteInfo.DEVICE_TYPE_TABLET_DOCKED),
161         COMPUTER(MediaRouter.RouteInfo.DEVICE_TYPE_COMPUTER),
162         GAME_CONSOLE(MediaRouter.RouteInfo.DEVICE_TYPE_GAME_CONSOLE),
163         CAR(MediaRouter.RouteInfo.DEVICE_TYPE_CAR),
164         SMARTWATCH(MediaRouter.RouteInfo.DEVICE_TYPE_SMARTWATCH),
165         SMARTPHONE(MediaRouter.RouteInfo.DEVICE_TYPE_SMARTPHONE),
166         GROUP(MediaRouter.RouteInfo.DEVICE_TYPE_GROUP),
167         UNKNOWN(MediaRouter.RouteInfo.DEVICE_TYPE_UNKNOWN);
168 
169         public final int mIntConstant;
170 
DeviceType(int intConstant)171         DeviceType(int intConstant) {
172             mIntConstant = intConstant;
173         }
174     }
175 
getId()176     public @NonNull String getId() {
177         return mId;
178     }
179 
setId(@onNull String id)180     public void setId(@NonNull String id) {
181         mId = id;
182     }
183 
getName()184     public @NonNull String getName() {
185         return mName;
186     }
187 
setName(@onNull String name)188     public void setName(@NonNull String name) {
189         mName = name;
190     }
191 
getDescription()192     public @NonNull String getDescription() {
193         return mDescription;
194     }
195 
setDescription(@onNull String description)196     public void setDescription(@NonNull String description) {
197         mDescription = description;
198     }
199 
getControlFilter()200     public @NonNull ControlFilter getControlFilter() {
201         return mControlFilter;
202     }
203 
setControlFilter(@onNull ControlFilter controlFilter)204     public void setControlFilter(@NonNull ControlFilter controlFilter) {
205         mControlFilter = controlFilter;
206     }
207 
getPlaybackStream()208     public @NonNull PlaybackStream getPlaybackStream() {
209         return mPlaybackStream;
210     }
211 
setPlaybackStream(@onNull PlaybackStream playbackStream)212     public void setPlaybackStream(@NonNull PlaybackStream playbackStream) {
213         mPlaybackStream = playbackStream;
214     }
215 
getPlaybackType()216     public @NonNull PlaybackType getPlaybackType() {
217         return mPlaybackType;
218     }
219 
setPlaybackType(@onNull PlaybackType playbackType)220     public void setPlaybackType(@NonNull PlaybackType playbackType) {
221         mPlaybackType = playbackType;
222     }
223 
isCanDisconnect()224     public boolean isCanDisconnect() {
225         return mCanDisconnect;
226     }
227 
setCanDisconnect(boolean canDisconnect)228     public void setCanDisconnect(boolean canDisconnect) {
229         mCanDisconnect = canDisconnect;
230     }
231 
getVolumeHandling()232     public @NonNull VolumeHandling getVolumeHandling() {
233         return mVolumeHandling;
234     }
235 
setVolumeHandling(@onNull VolumeHandling volumeHandling)236     public void setVolumeHandling(@NonNull VolumeHandling volumeHandling) {
237         mVolumeHandling = volumeHandling;
238     }
239 
getVolume()240     public int getVolume() {
241         return mVolume;
242     }
243 
setVolume(int volume)244     public void setVolume(int volume) {
245         mVolume = volume;
246     }
247 
getVolumeMax()248     public int getVolumeMax() {
249         return mVolumeMax;
250     }
251 
setVolumeMax(int volumeMax)252     public void setVolumeMax(int volumeMax) {
253         mVolumeMax = volumeMax;
254     }
255 
getDeviceType()256     public @NonNull DeviceType getDeviceType() {
257         return mDeviceType;
258     }
259 
setDeviceType(@onNull DeviceType deviceType)260     public void setDeviceType(@NonNull DeviceType deviceType) {
261         mDeviceType = deviceType;
262     }
263 
getGroupMemberIds()264     public @NonNull List<String> getGroupMemberIds() {
265         return mGroupMemberIds;
266     }
267 
setGroupMemberIds(@onNull List<String> groupMemberIds)268     public void setGroupMemberIds(@NonNull List<String> groupMemberIds) {
269         mGroupMemberIds = groupMemberIds;
270     }
271 
isSenderDriven()272     public boolean isSenderDriven() {
273         return mIsSenderDriven;
274     }
275 
setSenderDriven(boolean isSenderDriven)276     public void setSenderDriven(boolean isSenderDriven) {
277         mIsSenderDriven = isSenderDriven;
278     }
279 }
280