AvrcpHelperClasses.java revision e90c830b72f97189935e99e9e4f5a0c4f216ba72
1/*
2 * Copyright (C) 2016 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.bluetooth.avrcp;
18
19import android.media.session.MediaController;
20import android.media.session.MediaSession;
21
22import java.util.List;
23import java.util.Arrays;
24
25/*************************************************************************************************
26 * Helper classes used for callback/response of browsing commands:-
27 *     1) To bundle parameters for  native callbacks/response.
28 *     2) Stores information of Addressed and Browsed Media Players.
29 ************************************************************************************************/
30
31class AvrcpCmd {
32
33    public AvrcpCmd() {}
34
35    /* Helper classes to pass parameters from callbacks to Avrcp handler */
36    class FolderItemsCmd {
37        byte mScope;
38        int mStartItem;
39        int mEndItem;
40        byte mNumAttr;
41        int[] mAttrIDs;
42        public byte[] mAddress;
43
44        public FolderItemsCmd(byte[] address,byte scope, int startItem, int endItem, byte numAttr,
45                int[] attrIds) {
46            mAddress = address;
47            this.mScope = scope;
48            this.mStartItem = startItem;
49            this.mEndItem = endItem;
50            this.mNumAttr = numAttr;
51            this.mAttrIDs = attrIds;
52        }
53    }
54
55    class ItemAttrCmd {
56        byte mScope;
57        byte[] mUid;
58        int mUidCounter;
59        byte mNumAttr;
60        int[] mAttrIDs;
61        public byte[] mAddress;
62
63        public ItemAttrCmd(byte[] address, byte scope, byte[] uid, int uidCounter, byte numAttr,
64                int[] attrIDs) {
65            mAddress = address;
66            mScope = scope;
67            mUid = uid;
68            mUidCounter = uidCounter;
69            mNumAttr = numAttr;
70            mAttrIDs = attrIDs;
71        }
72    }
73
74    class ElementAttrCmd {
75        byte mNumAttr;
76        int[] mAttrIDs;
77        public byte[] mAddress;
78
79        public ElementAttrCmd(byte[] address, byte numAttr, int[] attrIDs) {
80            mAddress = address;
81            mNumAttr = numAttr;
82            mAttrIDs = attrIDs;
83        }
84    }
85}
86
87/* Helper classes to pass parameters to native response */
88class MediaPlayerListRsp {
89    byte mStatus;
90    short mUIDCounter;
91    byte itemType;
92    byte[] mPlayerTypes;
93    int[] mPlayerSubTypes;
94    byte[] mPlayStatusValues;
95    short[] mFeatureBitMaskValues;
96    String[] mPlayerNameList, mPackageNameList;
97    List<MediaController> mControllersList;
98    int mNumItems;
99
100    public MediaPlayerListRsp(byte status, short UIDCounter, int numItems, byte itemType,
101            byte[] playerTypes, int[] playerSubTypes, byte[] playStatusValues,
102            short[] featureBitMaskValues, String[] playerNameList, String packageNameList[],
103            List<MediaController> mediaControllerList) {
104        this.mStatus = status;
105        this.mUIDCounter = UIDCounter;
106        this.mNumItems = numItems;
107        this.itemType = itemType;
108        this.mPlayerTypes = playerTypes;
109        this.mPlayerSubTypes = new int[numItems];
110        this.mPlayerSubTypes = playerSubTypes;
111        this.mPlayStatusValues = new byte[numItems];
112        this.mPlayStatusValues = playStatusValues;
113        int bitMaskSize = AvrcpConstants.AVRC_FEATURE_MASK_SIZE;
114        this.mFeatureBitMaskValues = new short[numItems * bitMaskSize];
115        for (int bitMaskIndex = 0; bitMaskIndex < (numItems * bitMaskSize); bitMaskIndex++) {
116            this.mFeatureBitMaskValues[bitMaskIndex] = featureBitMaskValues[bitMaskIndex];
117        }
118        this.mPlayerNameList = playerNameList;
119        this.mPackageNameList = packageNameList;
120        this.mControllersList = mediaControllerList;
121    }
122}
123
124class FolderItemsRsp {
125    byte mStatus;
126    short mUIDCounter;
127    byte mScope;
128    int mNumItems;
129    byte[] mFolderTypes;
130    byte[] mPlayable;
131    byte[] mItemTypes;
132    byte[] mItemUid;
133    String[] mDisplayNames; /* display name of the item. Eg: Folder name or song name */
134    int[] mAttributesNum;
135    int[] mAttrIds;
136    String[] mAttrValues;
137
138    public FolderItemsRsp(byte Status, short UIDCounter, byte scope, int numItems,
139            byte[] folderTypes, byte[] playable, byte[] ItemTypes, byte[] ItemsUid,
140            String[] displayNameArray, int[] AttributesNum, int[] AttrIds, String[] attrValues) {
141        this.mStatus = Status;
142        this.mUIDCounter = UIDCounter;
143        this.mScope = scope;
144        this.mNumItems = numItems;
145        this.mFolderTypes = folderTypes;
146        this.mPlayable = playable;
147        this.mItemTypes = ItemTypes;
148        this.mItemUid = ItemsUid;
149        this.mDisplayNames = displayNameArray;
150        this.mAttributesNum = AttributesNum;
151        this.mAttrIds = AttrIds;
152        this.mAttrValues = attrValues;
153    }
154}
155
156class ItemAttrRsp {
157    byte mStatus;
158    byte mNumAttr;
159    int[] mAttributesIds;
160    String[] mAttributesArray;
161
162    public ItemAttrRsp(byte status, byte numAttr, int[] attributesIds, String[] attributesArray) {
163        this.mStatus = status;
164        this.mNumAttr = numAttr;
165        this.mAttributesIds = attributesIds;
166        this.mAttributesArray = attributesArray;
167    }
168}
169
170/* Helps managing the NowPlayingList */
171class NowPlayingListManager {
172    private List<MediaSession.QueueItem> mNowPlayingItems = null;
173
174    synchronized void setNowPlayingList(List<MediaSession.QueueItem> queue) {
175        mNowPlayingItems = queue;
176    }
177
178    synchronized List<MediaSession.QueueItem> getNowPlayingList() {
179        return mNowPlayingItems;
180    }
181}
182
183/* stores information of Media Players in the system */
184class MediaPlayerInfo {
185
186    private String packageName;
187    private byte majorType;
188    private int subType;
189    private byte playStatus;
190    private short[] featureBitMask;
191    private String displayableName;
192    private MediaController mediaController;
193
194    MediaPlayerInfo(String packageName, byte majorType, int subType, byte playStatus,
195            short[] featureBitMask, String displayableName, MediaController mediaController) {
196        this.setPackageName(packageName);
197        this.setMajorType(majorType);
198        this.setSubType(subType);
199        this.playStatus = playStatus;
200
201        // copying the FeatureBitMask array
202        this.setFeatureBitMask(new short[featureBitMask.length]);
203        for (int count = 0; count < featureBitMask.length; count++) {
204            this.getFeatureBitMask()[count] = featureBitMask[count];
205        }
206
207        this.setDisplayableName(displayableName);
208        this.setMediaController(mediaController);
209    }
210
211    /* getters and setters */
212    byte getPlayStatus() {
213        return playStatus;
214    }
215
216    void setPlayStatus(byte playStatus) {
217        this.playStatus = playStatus;
218    }
219
220    MediaController getMediaController() {
221        return mediaController;
222    }
223
224    void setMediaController(MediaController mediaController) {
225        this.mediaController = mediaController;
226    }
227
228    String getPackageName() {
229        return packageName;
230    }
231
232    void setPackageName(String packageName) {
233        this.packageName = packageName;
234    }
235
236    byte getMajorType() {
237        return majorType;
238    }
239
240    void setMajorType(byte majorType) {
241        this.majorType = majorType;
242    }
243
244    int getSubType() {
245        return subType;
246    }
247
248    void setSubType(int subType) {
249        this.subType = subType;
250    }
251
252    String getDisplayableName() {
253        return displayableName;
254    }
255
256    void setDisplayableName(String displayableName) {
257        this.displayableName = displayableName;
258    }
259
260    short[] getFeatureBitMask() {
261        return featureBitMask;
262    }
263
264    void setFeatureBitMask(short[] featureBitMask) {
265        this.featureBitMask = featureBitMask;
266    }
267
268    @Override
269    public String toString() {
270        StringBuilder sb = new StringBuilder();
271        sb.append("\n+++ MediaPlayerInfo: +++");
272        sb.append("\nPlayer Package Name = " + getPackageName());
273        sb.append("\nMajor Player Type = " + getMajorType());
274        sb.append("\nPlayer SubType = " + getSubType());
275        sb.append("\nPlay Status = " + playStatus);
276        sb.append("\nFeatureBitMask:\n ");
277        for (int count = 0; count < getFeatureBitMask().length; count++) {
278            sb.append("\nFeature BitMask[" + count + "] = " + getFeatureBitMask()[count]);
279        }
280        sb.append("\nDisplayable Name = " + getDisplayableName());
281        sb.append("\nMedia Controller = " + getMediaController().toString());
282
283        return sb.toString();
284    }
285}
286
287/* stores information for browsable Media Players available in the system */
288class BrowsePlayerInfo {
289    String packageName;
290    String displayableName;
291    String serviceClass;
292
293    public BrowsePlayerInfo(String packageName, String displayableName, String serviceClass) {
294        this.packageName = packageName;
295        this.displayableName = displayableName;
296        this.serviceClass = serviceClass;
297    }
298
299    @Override
300    public String toString() {
301        StringBuilder sb = new StringBuilder();
302        sb.append("\n+++ BrowsePlayerInfo: +++");
303        sb.append("\nPackage Name = " + packageName);
304        sb.append("\nDisplayable Name = " + displayableName);
305        sb.append("\nService Class = " + serviceClass);
306        return sb.toString();
307    }
308}
309
310class FolderItemsData {
311
312    /* initialize sizes for rsp parameters */
313    int mNumItems;
314    int[] mAttributesNum;
315    byte[] mFolderTypes ;
316    byte[] mItemTypes;
317    byte[] mPlayable;
318    byte[] mItemUid;
319    String[] mDisplayNames;
320    int[] mAttrIds;
321    String[] mAttrValues;
322    int attrCounter;
323
324    public FolderItemsData(int size) {
325        mNumItems = size;
326        mAttributesNum = new int[size];
327
328        mFolderTypes = new byte[size]; /* folderTypes */
329        mItemTypes = new byte[size]; /* folder or media item */
330        mPlayable = new byte[size];
331        Arrays.fill(mFolderTypes, AvrcpConstants.FOLDER_TYPE_MIXED);
332        Arrays.fill(mItemTypes, AvrcpConstants.BTRC_ITEM_MEDIA);
333        Arrays.fill(mPlayable, AvrcpConstants.ITEM_PLAYABLE);
334
335        mItemUid = new byte[size * AvrcpConstants.UID_SIZE];
336        mDisplayNames = new String[size];
337
338        mAttrIds = null; /* array of attr ids */
339        mAttrValues = null; /* array of attr values */
340    }
341}
342