Source code
package android.support.v4.media;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable.Creator;
import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Set;
public final class MediaMetadataCompat implements Parcelable {
public static final Creator<MediaMetadataCompat> CREATOR = new Creator<MediaMetadataCompat>() {
public MediaMetadataCompat createFromParcel(Parcel in) {
return new MediaMetadataCompat(in);
}
public MediaMetadataCompat[] newArray(int size) {
return new MediaMetadataCompat[size];
}
};
private static final ArrayMap<String, Integer> METADATA_KEYS_TYPE = new ArrayMap();
public static final String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
public static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
public static final String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
public static final String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
public static final String METADATA_KEY_ART = "android.media.metadata.ART";
public static final String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
public static final String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
public static final String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
public static final String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
public static final String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
public static final String METADATA_KEY_DATE = "android.media.metadata.DATE";
public static final String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
public static final String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
public static final String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
public static final String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
public static final String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
public static final String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
public static final String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
public static final String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
public static final String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
public static final String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
public static final String METADATA_KEY_RATING = "android.media.metadata.RATING";
public static final String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
public static final String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
public static final String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
public static final String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
public static final String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
private static final int METADATA_TYPE_BITMAP = 2;
private static final int METADATA_TYPE_LONG = 0;
private static final int METADATA_TYPE_RATING = 3;
private static final int METADATA_TYPE_TEXT = 1;
private static final String[] PREFERRED_BITMAP_ORDER = new String[]{METADATA_KEY_DISPLAY_ICON, METADATA_KEY_ART, METADATA_KEY_ALBUM_ART};
private static final String[] PREFERRED_DESCRIPTION_ORDER = new String[]{METADATA_KEY_TITLE, METADATA_KEY_ARTIST, METADATA_KEY_ALBUM, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_WRITER, METADATA_KEY_AUTHOR, METADATA_KEY_COMPOSER};
private static final String[] PREFERRED_URI_ORDER = new String[]{METADATA_KEY_DISPLAY_ICON_URI, METADATA_KEY_ART_URI, METADATA_KEY_ALBUM_ART_URI};
private static final String TAG = "MediaMetadata";
private final Bundle mBundle;
private MediaDescriptionCompat mDescription;
private Object mMetadataObj;
@Retention(RetentionPolicy.SOURCE)
public @interface BitmapKey {
}
public static final class Builder {
private final Bundle mBundle;
public Builder() {
this.mBundle = new Bundle();
}
public Builder(MediaMetadataCompat source) {
this.mBundle = new Bundle(source.mBundle);
}
public Builder putText(String key, CharSequence value) {
if (!MediaMetadataCompat.METADATA_KEYS_TYPE.containsKey(key) || ((Integer) MediaMetadataCompat.METADATA_KEYS_TYPE.get(key)).intValue() == 1) {
this.mBundle.putCharSequence(key, value);
return this;
}
throw new IllegalArgumentException("The " + key + " key cannot be used to put a CharSequence");
}
public Builder putString(String key, String value) {
if (!MediaMetadataCompat.METADATA_KEYS_TYPE.containsKey(key) || ((Integer) MediaMetadataCompat.METADATA_KEYS_TYPE.get(key)).intValue() == 1) {
this.mBundle.putCharSequence(key, value);
return this;
}
throw new IllegalArgumentException("The " + key + " key cannot be used to put a String");
}
public Builder putLong(String key, long value) {
if (!MediaMetadataCompat.METADATA_KEYS_TYPE.containsKey(key) || ((Integer) MediaMetadataCompat.METADATA_KEYS_TYPE.get(key)).intValue() == 0) {
this.mBundle.putLong(key, value);
return this;
}
throw new IllegalArgumentException("The " + key + " key cannot be used to put a long");
}
public Builder putRating(String key, RatingCompat value) {
if (!MediaMetadataCompat.METADATA_KEYS_TYPE.containsKey(key) || ((Integer) MediaMetadataCompat.METADATA_KEYS_TYPE.get(key)).intValue() == 3) {
this.mBundle.putParcelable(key, value);
return this;
}
throw new IllegalArgumentException("The " + key + " key cannot be used to put a Rating");
}
public Builder putBitmap(String key, Bitmap value) {
if (!MediaMetadataCompat.METADATA_KEYS_TYPE.containsKey(key) || ((Integer) MediaMetadataCompat.METADATA_KEYS_TYPE.get(key)).intValue() == 2) {
this.mBundle.putParcelable(key, value);
return this;
}
throw new IllegalArgumentException("The " + key + " key cannot be used to put a Bitmap");
}
public MediaMetadataCompat build() {
return new MediaMetadataCompat(this.mBundle);
}
}
@Retention(RetentionPolicy.SOURCE)
public @interface LongKey {
}
@Retention(RetentionPolicy.SOURCE)
public @interface RatingKey {
}
@Retention(RetentionPolicy.SOURCE)
public @interface TextKey {
}
static {
METADATA_KEYS_TYPE.put(METADATA_KEY_TITLE, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_ARTIST, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_DURATION, Integer.valueOf(0));
METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_AUTHOR, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_WRITER, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_COMPOSER, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_COMPILATION, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_DATE, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_YEAR, Integer.valueOf(0));
METADATA_KEYS_TYPE.put(METADATA_KEY_GENRE, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_TRACK_NUMBER, Integer.valueOf(0));
METADATA_KEYS_TYPE.put(METADATA_KEY_NUM_TRACKS, Integer.valueOf(0));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISC_NUMBER, Integer.valueOf(0));
METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ARTIST, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_ART, Integer.valueOf(2));
METADATA_KEYS_TYPE.put(METADATA_KEY_ART_URI, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART, Integer.valueOf(2));
METADATA_KEYS_TYPE.put(METADATA_KEY_ALBUM_ART_URI, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_USER_RATING, Integer.valueOf(3));
METADATA_KEYS_TYPE.put(METADATA_KEY_RATING, Integer.valueOf(3));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_TITLE, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_SUBTITLE, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_DESCRIPTION, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON, Integer.valueOf(2));
METADATA_KEYS_TYPE.put(METADATA_KEY_DISPLAY_ICON_URI, Integer.valueOf(1));
METADATA_KEYS_TYPE.put(METADATA_KEY_MEDIA_ID, Integer.valueOf(1));
}
private MediaMetadataCompat(Bundle bundle) {
this.mBundle = new Bundle(bundle);
}
private MediaMetadataCompat(Parcel in) {
this.mBundle = in.readBundle();
}
public boolean containsKey(String key) {
return this.mBundle.containsKey(key);
}
public CharSequence getText(String key) {
return this.mBundle.getCharSequence(key);
}
public String getString(String key) {
CharSequence text = this.mBundle.getCharSequence(key);
if (text != null) {
return text.toString();
}
return null;
}
public long getLong(String key) {
return this.mBundle.getLong(key, 0);
}
public RatingCompat getRating(String key) {
RatingCompat rating = null;
try {
return (RatingCompat) this.mBundle.getParcelable(key);
} catch (Exception e) {
Log.w(TAG, "Failed to retrieve a key as Rating.", e);
return rating;
}
}
public Bitmap getBitmap(String key) {
Bitmap bmp = null;
try {
return (Bitmap) this.mBundle.getParcelable(key);
} catch (Exception e) {
Log.w(TAG, "Failed to retrieve a key as Bitmap.", e);
return bmp;
}
}
public MediaDescriptionCompat getDescription() {
if (this.mDescription != null) {
return this.mDescription;
}
String next;
String mediaId = getString(METADATA_KEY_MEDIA_ID);
CharSequence[] text = new CharSequence[3];
Bitmap icon = null;
Uri iconUri = null;
CharSequence displayText = getText(METADATA_KEY_DISPLAY_TITLE);
if (TextUtils.isEmpty(displayText)) {
int textIndex = 0;
int keyIndex = 0;
while (textIndex < text.length && keyIndex < PREFERRED_DESCRIPTION_ORDER.length) {
int keyIndex2 = keyIndex + 1;
next = getText(PREFERRED_DESCRIPTION_ORDER[keyIndex]);
if (!TextUtils.isEmpty(next)) {
int textIndex2 = textIndex + 1;
text[textIndex] = next;
textIndex = textIndex2;
}
keyIndex = keyIndex2;
}
} else {
text[0] = displayText;
text[1] = getText(METADATA_KEY_DISPLAY_SUBTITLE);
text[2] = getText(METADATA_KEY_DISPLAY_DESCRIPTION);
}
for (String bitmap : PREFERRED_BITMAP_ORDER) {
Bitmap next2 = getBitmap(bitmap);
if (next2 != null) {
icon = next2;
break;
}
}
for (String bitmap2 : PREFERRED_URI_ORDER) {
next = getString(bitmap2);
if (!TextUtils.isEmpty(next)) {
iconUri = Uri.parse(next);
break;
}
}
android.support.v4.media.MediaDescriptionCompat.Builder bob = new android.support.v4.media.MediaDescriptionCompat.Builder();
bob.setMediaId(mediaId);
bob.setTitle(text[0]);
bob.setSubtitle(text[1]);
bob.setDescription(text[2]);
bob.setIconBitmap(icon);
bob.setIconUri(iconUri);
this.mDescription = bob.build();
return this.mDescription;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeBundle(this.mBundle);
}
public int size() {
return this.mBundle.size();
}
public Set<String> keySet() {
return this.mBundle.keySet();
}
public Bundle getBundle() {
return this.mBundle;
}
public static MediaMetadataCompat fromMediaMetadata(Object metadataObj) {
if (metadataObj == null || VERSION.SDK_INT < 21) {
return null;
}
Builder builder = new Builder();
for (String key : MediaMetadataCompatApi21.keySet(metadataObj)) {
Integer type = (Integer) METADATA_KEYS_TYPE.get(key);
if (type != null) {
switch (type.intValue()) {
case 0:
builder.putLong(key, MediaMetadataCompatApi21.getLong(metadataObj, key));
break;
case 1:
builder.putText(key, MediaMetadataCompatApi21.getText(metadataObj, key));
break;
case 2:
builder.putBitmap(key, MediaMetadataCompatApi21.getBitmap(metadataObj, key));
break;
case 3:
builder.putRating(key, RatingCompat.fromRating(MediaMetadataCompatApi21.getRating(metadataObj, key)));
break;
default:
break;
}
}
}
MediaMetadataCompat metadata = builder.build();
metadata.mMetadataObj = metadataObj;
return metadata;
}
public Object getMediaMetadata() {
if (this.mMetadataObj != null || VERSION.SDK_INT < 21) {
return this.mMetadataObj;
}
Object builderObj = android.support.v4.media.MediaMetadataCompatApi21.Builder.newInstance();
for (String key : keySet()) {
Integer type = (Integer) METADATA_KEYS_TYPE.get(key);
if (type != null) {
switch (type.intValue()) {
case 0:
android.support.v4.media.MediaMetadataCompatApi21.Builder.putLong(builderObj, key, getLong(key));
break;
case 1:
android.support.v4.media.MediaMetadataCompatApi21.Builder.putText(builderObj, key, getText(key));
break;
case 2:
android.support.v4.media.MediaMetadataCompatApi21.Builder.putBitmap(builderObj, key, getBitmap(key));
break;
case 3:
android.support.v4.media.MediaMetadataCompatApi21.Builder.putRating(builderObj, key, getRating(key).getRating());
break;
default:
break;
}
}
}
this.mMetadataObj = android.support.v4.media.MediaMetadataCompatApi21.Builder.build(builderObj);
return this.mMetadataObj;
}
}