blob: 033ea048fc12d75ff37d44f1157dc28b36bc33b7 [file] [log] [blame]
/*
* 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.List;
import java.util.Map;
import java.util.HashMap;
/*
* 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 DBG = true;
/*
* 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.
public TrackInfo() {
this(new ArrayList<Integer>(), new ArrayList<String>());
}
public 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;
}
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 (DBG) 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();
}
}