| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| package com.android.bluetooth.avrcpcontroller; |
| |
| import android.media.MediaMetadata; |
| import android.util.Log; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /* |
| * Contains information about tracks that either currently playing or maintained in playlist |
| * This is used as a local repository for information that will be passed on as MediaMetadata to the |
| * MediaSessionServicve |
| */ |
| class TrackInfo { |
| private static final String TAG = "AvrcpTrackInfo"; |
| private static final boolean VDBG = false; |
| |
| /* |
| * Default values for each of the items from JNI |
| */ |
| private static final int TRACK_NUM_INVALID = -1; |
| private static final int TOTAL_TRACKS_INVALID = -1; |
| private static final int TOTAL_TRACK_TIME_INVALID = -1; |
| private static final String UNPOPULATED_ATTRIBUTE = ""; |
| |
| /* |
| *Element Id Values for GetMetaData from JNI |
| */ |
| private static final int MEDIA_ATTRIBUTE_TITLE = 0x01; |
| private static final int MEDIA_ATTRIBUTE_ARTIST_NAME = 0x02; |
| private static final int MEDIA_ATTRIBUTE_ALBUM_NAME = 0x03; |
| private static final int MEDIA_ATTRIBUTE_TRACK_NUMBER = 0x04; |
| private static final int MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER = 0x05; |
| private static final int MEDIA_ATTRIBUTE_GENRE = 0x06; |
| private static final int MEDIA_ATTRIBUTE_PLAYING_TIME = 0x07; |
| |
| |
| private final String mArtistName; |
| private final String mTrackTitle; |
| private final String mAlbumTitle; |
| private final String mGenre; |
| private final long mTrackNum; // number of audio file on original recording. |
| private final long mTotalTracks; // total number of tracks on original recording |
| private final long mTrackLen; // full length of AudioFile. |
| |
| TrackInfo() { |
| this(new ArrayList<Integer>(), new ArrayList<String>()); |
| } |
| |
| TrackInfo(List<Integer> attrIds, List<String> attrMap) { |
| Map<Integer, String> attributeMap = new HashMap<>(); |
| for (int i = 0; i < attrIds.size(); i++) { |
| attributeMap.put(attrIds.get(i), attrMap.get(i)); |
| } |
| |
| String attribute; |
| mTrackTitle = attributeMap.getOrDefault(MEDIA_ATTRIBUTE_TITLE, UNPOPULATED_ATTRIBUTE); |
| |
| mArtistName = attributeMap.getOrDefault(MEDIA_ATTRIBUTE_ARTIST_NAME, UNPOPULATED_ATTRIBUTE); |
| |
| mAlbumTitle = attributeMap.getOrDefault(MEDIA_ATTRIBUTE_ALBUM_NAME, UNPOPULATED_ATTRIBUTE); |
| |
| attribute = attributeMap.get(MEDIA_ATTRIBUTE_TRACK_NUMBER); |
| mTrackNum = (attribute != null && !attribute.isEmpty()) ? Long.valueOf(attribute) |
| : TRACK_NUM_INVALID; |
| |
| attribute = attributeMap.get(MEDIA_ATTRIBUTE_TOTAL_TRACK_NUMBER); |
| mTotalTracks = (attribute != null && !attribute.isEmpty()) ? Long.valueOf(attribute) |
| : TOTAL_TRACKS_INVALID; |
| |
| mGenre = attributeMap.getOrDefault(MEDIA_ATTRIBUTE_GENRE, UNPOPULATED_ATTRIBUTE); |
| |
| attribute = attributeMap.get(MEDIA_ATTRIBUTE_PLAYING_TIME); |
| mTrackLen = (attribute != null && !attribute.isEmpty()) ? Long.valueOf(attribute) |
| : TOTAL_TRACK_TIME_INVALID; |
| } |
| |
| @Override |
| public String toString() { |
| return "Metadata [artist=" + mArtistName + " trackTitle= " + mTrackTitle + " albumTitle= " |
| + mAlbumTitle + " genre= " + mGenre + " trackNum= " + Long.toString(mTrackNum) |
| + " track_len : " + Long.toString(mTrackLen) + " TotalTracks " + Long.toString( |
| mTotalTracks) + "]"; |
| } |
| |
| public MediaMetadata getMediaMetaData() { |
| if (VDBG) { |
| Log.d(TAG, " TrackInfo " + toString()); |
| } |
| MediaMetadata.Builder mMetaDataBuilder = new MediaMetadata.Builder(); |
| mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, mArtistName); |
| mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, mTrackTitle); |
| mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_ALBUM, mAlbumTitle); |
| mMetaDataBuilder.putString(MediaMetadata.METADATA_KEY_GENRE, mGenre); |
| mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER, mTrackNum); |
| mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS, mTotalTracks); |
| mMetaDataBuilder.putLong(MediaMetadata.METADATA_KEY_DURATION, mTrackLen); |
| return mMetaDataBuilder.build(); |
| } |
| |
| |
| public String displayMetaData() { |
| MediaMetadata metaData = getMediaMetaData(); |
| StringBuffer sb = new StringBuffer(); |
| /* getDescription only contains artist, title and album */ |
| sb.append(metaData.getDescription().toString() + " "); |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_GENRE)) { |
| sb.append(metaData.getString(MediaMetadata.METADATA_KEY_GENRE) + " "); |
| } |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_MEDIA_ID)) { |
| sb.append(metaData.getString(MediaMetadata.METADATA_KEY_MEDIA_ID) + " "); |
| } |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER)) { |
| sb.append( |
| Long.toString(metaData.getLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER)) + " "); |
| } |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_NUM_TRACKS)) { |
| sb.append(Long.toString(metaData.getLong(MediaMetadata.METADATA_KEY_NUM_TRACKS)) + " "); |
| } |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER)) { |
| sb.append(Long.toString(metaData.getLong(MediaMetadata.METADATA_KEY_DURATION)) + " "); |
| } |
| if (metaData.containsKey(MediaMetadata.METADATA_KEY_TRACK_NUMBER)) { |
| sb.append(Long.toString(metaData.getLong(MediaMetadata.METADATA_KEY_DURATION)) + " "); |
| } |
| return sb.toString(); |
| } |
| } |