1cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik/*
2cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * Copyright (C) 2014 The Android Open Source Project
3cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik *
4cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * Licensed under the Apache License, Version 2.0 (the "License");
5cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * you may not use this file except in compliance with the License.
6cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * You may obtain a copy of the License at
7cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik *
8cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik *      http://www.apache.org/licenses/LICENSE-2.0
9cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik *
10cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * Unless required by applicable law or agreed to in writing, software
11cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * distributed under the License is distributed on an "AS IS" BASIS,
12cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * See the License for the specific language governing permissions and
14cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * limitations under the License.
15cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik */
16cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikpackage android.support.v4.media;
17cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
18cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.graphics.Bitmap;
19cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.net.Uri;
20cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Build;
21cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Bundle;
22cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Parcel;
23cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Parcelable;
24cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.text.TextUtils;
25cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
26cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik/**
27cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * A simple set of metadata for a media item suitable for display. This can be
28cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * created using the Builder or retrieved from existing metadata using
29cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * {@link MediaMetadataCompat#getDescription()}.
30cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik */
31cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikpublic final class MediaDescriptionCompat implements Parcelable {
32cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
33cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A unique persistent id for the content or null.
34cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
35cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final String mMediaId;
36cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
37cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A primary title suitable for display or null.
38cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
39cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mTitle;
40cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
41cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A subtitle suitable for display or null.
42cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
43cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mSubtitle;
44cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
45cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A description suitable for display or null.
46cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
47cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mDescription;
48cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
49cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A bitmap icon suitable for display or null.
50cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
51cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bitmap mIcon;
52cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
53cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A Uri for an icon suitable for display or null.
54cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
55cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Uri mIconUri;
56cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
57cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Extras for opaque use by apps/system.
58cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
59cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bundle mExtras;
60cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
61cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
62cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A cached copy of the equivalent framework object.
63cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
64cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private Object mDescriptionObj;
65cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
66cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private MediaDescriptionCompat(String mediaId, CharSequence title, CharSequence subtitle,
67cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            CharSequence description, Bitmap icon, Uri iconUri, Bundle extras) {
68cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = mediaId;
69cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = title;
70cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = subtitle;
71cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = description;
72cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = icon;
73cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = iconUri;
74cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = extras;
75cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
76cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
77cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private MediaDescriptionCompat(Parcel in) {
78cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = in.readString();
79cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
80cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
81cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
82cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = in.readParcelable(null);
83cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = in.readParcelable(null);
84cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = in.readBundle();
85cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
86cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
87cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
88cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns the media id or null. See
89cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link MediaMetadataCompat#METADATA_KEY_MEDIA_ID}.
90cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
91cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String getMediaId() {
92cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mMediaId;
93cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
94cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
95cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
96cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a title suitable for display or null.
97cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
98cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A title or null.
99cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
100cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getTitle() {
101cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle;
102cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
103cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
104cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
105cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a subtitle suitable for display or null.
106cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
107cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A subtitle or null.
108cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
109cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getSubtitle() {
110cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mSubtitle;
111cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
112cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
113cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
114cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a description suitable for display or null.
115cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
116cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A description or null.
117cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
118cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getDescription() {
119cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescription;
120cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
121cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
122cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
123cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a bitmap icon suitable for display or null.
124cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
125cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon or null.
126cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
127cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bitmap getIconBitmap() {
128cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIcon;
129cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
130cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
131cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
132cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a Uri for an icon suitable for display or null.
133cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
134cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon uri or null.
135cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
136cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Uri getIconUri() {
137cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIconUri;
138cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
139cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
140cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
141cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns any extras that were added to the description.
142cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
143cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A bundle of extras or null.
144cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
145cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bundle getExtras() {
146cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mExtras;
147cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
148cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
149cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
150cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public int describeContents() {
151cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return 0;
152cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
153cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
154cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
155cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public void writeToParcel(Parcel dest, int flags) {
156cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (Build.VERSION.SDK_INT < 21) {
157cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeString(mMediaId);
158cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mTitle, dest, flags);
159cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mSubtitle, dest, flags);
160cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mDescription, dest, flags);
161cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIcon, flags);
162cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIconUri, flags);
163cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeBundle(mExtras);
164cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        } else {
165cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            MediaDescriptionCompatApi21.writeToParcel(getMediaDescription(), dest, flags);
166cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
167cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
168cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
169cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
170cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String toString() {
171cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle + ", " + mSubtitle + ", " + mDescription;
172cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
173cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
174cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
175cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Gets the underlying framework {@link android.media.MediaDescription}
176cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * object.
177cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
178cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on
179cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later.
180cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
181cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
182cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link android.media.MediaDescription} object, or
183cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         null if none.
184cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
185cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Object getMediaDescription() {
186cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (mDescriptionObj != null || Build.VERSION.SDK_INT < 21) {
187cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return mDescriptionObj;
188cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
189cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        Object bob = MediaDescriptionCompatApi21.Builder.newInstance();
190cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setMediaId(bob, mMediaId);
191cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setTitle(bob, mTitle);
192cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setSubtitle(bob, mSubtitle);
193cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setDescription(bob, mDescription);
194cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconBitmap(bob, mIcon);
195cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconUri(bob, mIconUri);
196cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setExtras(bob, mExtras);
197cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescriptionObj = MediaDescriptionCompatApi21.Builder.build(bob);
198cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
199cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescriptionObj;
200cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
201cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
202cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
203cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Creates an instance from a framework
204cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.media.MediaDescription} object.
205cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
206cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on API 21+.
207cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
208cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
209cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @param descriptionObj A {@link android.media.MediaDescription} object, or
210cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *            null if none.
211cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link MediaMetadataCompat} object, or null if
212cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         none.
213cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
214cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static MediaDescriptionCompat fromMediaDescription(Object descriptionObj) {
215cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (descriptionObj == null || Build.VERSION.SDK_INT < 21) {
216cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return null;
217cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
218cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
219cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        Builder bob = new Builder();
220cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setMediaId(MediaDescriptionCompatApi21.getMediaId(descriptionObj));
221cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setTitle(MediaDescriptionCompatApi21.getTitle(descriptionObj));
222cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setSubtitle(MediaDescriptionCompatApi21.getSubtitle(descriptionObj));
223cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setDescription(MediaDescriptionCompatApi21.getDescription(descriptionObj));
224cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setIconBitmap(MediaDescriptionCompatApi21.getIconBitmap(descriptionObj));
225cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setIconUri(MediaDescriptionCompatApi21.getIconUri(descriptionObj));
226cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setExtras(MediaDescriptionCompatApi21.getExtras(descriptionObj));
227cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompat descriptionCompat = bob.build();
228cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        descriptionCompat.mDescriptionObj = descriptionObj;
229cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
230cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return descriptionCompat;
231cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
232cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
233cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final Parcelable.Creator<MediaDescriptionCompat> CREATOR =
234cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            new Parcelable.Creator<MediaDescriptionCompat>() {
235cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
236cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat createFromParcel(Parcel in) {
237cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    if (Build.VERSION.SDK_INT < 21) {
238cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return new MediaDescriptionCompat(in);
239cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    } else {
240cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return fromMediaDescription(MediaDescriptionCompatApi21.fromParcel(in));
241cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    }
242cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
243cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
244cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
245cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat[] newArray(int size) {
246cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    return new MediaDescriptionCompat[size];
247cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
248cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            };
249cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
250cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
251cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Builder for {@link MediaDescriptionCompat} objects.
252cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
253cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final class Builder {
254cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private String mMediaId;
255cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mTitle;
256cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mSubtitle;
257cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mDescription;
258cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bitmap mIcon;
259cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Uri mIconUri;
260cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bundle mExtras;
261cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
262cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
263cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates an initially empty builder.
264cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
265cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder() {
266cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
267cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
268cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
269cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the media id.
270cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
271cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param mediaId The unique id for the item or null.
272cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
273cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
274cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setMediaId(String mediaId) {
275cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mMediaId = mediaId;
276cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
277cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
278cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
279cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
280cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the title.
281cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
282cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param title A title suitable for display to the user or null.
283cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
284cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
285cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setTitle(CharSequence title) {
286cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mTitle = title;
287cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
288cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
289cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
290cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
291cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the subtitle.
292cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
293cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param subtitle A subtitle suitable for display to the user or null.
294cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
295cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
296cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setSubtitle(CharSequence subtitle) {
297cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mSubtitle = subtitle;
298cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
299cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
300cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
301cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
302cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the description.
303cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
304cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param description A description suitable for display to the user or
305cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
306cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
307cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
308cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setDescription(CharSequence description) {
309cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mDescription = description;
310cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
311cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
312cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
313cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
314cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon.
315cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
316cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param icon A {@link Bitmap} icon suitable for display to the user or
317cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
318cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
319cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
320cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setIconBitmap(Bitmap icon) {
321cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIcon = icon;
322cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
323cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
324cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
325cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
326cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon uri.
327cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
328cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param iconUri A {@link Uri} for an icon suitable for display to the
329cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            user or null.
330cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
331cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
332cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setIconUri(Uri iconUri) {
333cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIconUri = iconUri;
334cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
335cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
336cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
337cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
338cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets a bundle of extras.
339cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
340cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param extras The extras to include with this description or null.
341cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
342cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
343cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder setExtras(Bundle extras) {
344cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mExtras = extras;
345cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
346cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
347cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
348cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
349cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates a {@link MediaDescriptionCompat} instance with the specified
350cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * fields.
351cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
352cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return A MediaDescriptionCompat instance.
353cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
354cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public MediaDescriptionCompat build() {
355cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return new MediaDescriptionCompat(mMediaId, mTitle, mSubtitle, mDescription, mIcon,
356cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    mIconUri, mExtras);
357cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
358cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
359cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik}
360