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;
249cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lakeimport android.support.annotation.Nullable;
25cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.text.TextUtils;
26cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
27cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik/**
28cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * A simple set of metadata for a media item suitable for display. This can be
29cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * created using the Builder or retrieved from existing metadata using
30cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * {@link MediaMetadataCompat#getDescription()}.
31cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik */
32cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikpublic final class MediaDescriptionCompat implements Parcelable {
33cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
3401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * Custom key to store a media URI on API 21-22 devices (before it became part of the
3501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * framework class) when parceling/converting to and from framework objects.
3601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     *
3701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * @hide
3801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     */
3901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    public static final String DESCRIPTION_KEY_MEDIA_URI =
4001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            "android.support.v4.media.description.MEDIA_URI";
4101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    /**
4201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * Custom key to store whether the original Bundle provided by the developer was null
4301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     *
4401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * @hide
4501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     */
4601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    public static final String DESCRIPTION_KEY_NULL_BUNDLE_FLAG =
4701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            "android.support.v4.media.description.NULL_BUNDLE_FLAG";
4801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    /**
49cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A unique persistent id for the content or null.
50cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
51cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final String mMediaId;
52cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
53cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A primary title suitable for display or null.
54cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
55cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mTitle;
56cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
57cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A subtitle suitable for display or null.
58cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
59cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mSubtitle;
60cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
61cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A description suitable for display or null.
62cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
63cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mDescription;
64cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
65cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A bitmap icon suitable for display or null.
66cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
67cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bitmap mIcon;
68cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
69cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A Uri for an icon suitable for display or null.
70cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
71cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Uri mIconUri;
72cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
73cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Extras for opaque use by apps/system.
74cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
75cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bundle mExtras;
769cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    /**
779cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * A Uri to identify this content.
789cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     */
799cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    private final Uri mMediaUri;
80cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
81cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
82cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A cached copy of the equivalent framework object.
83cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
84cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private Object mDescriptionObj;
85cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
86cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private MediaDescriptionCompat(String mediaId, CharSequence title, CharSequence subtitle,
879cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            CharSequence description, Bitmap icon, Uri iconUri, Bundle extras, Uri mediaUri) {
88cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = mediaId;
89cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = title;
90cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = subtitle;
91cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = description;
92cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = icon;
93cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = iconUri;
94cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = extras;
959cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        mMediaUri = mediaUri;
96cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
97cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
98cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private MediaDescriptionCompat(Parcel in) {
99cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = in.readString();
100cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
101cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
102cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
103cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = in.readParcelable(null);
104cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = in.readParcelable(null);
105cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = in.readBundle();
1069cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        mMediaUri = in.readParcelable(null);
107cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
108cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
109cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
110cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns the media id or null. See
111cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link MediaMetadataCompat#METADATA_KEY_MEDIA_ID}.
112cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1139cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
114cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String getMediaId() {
115cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mMediaId;
116cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
117cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
118cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
119cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a title suitable for display or null.
120cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
121cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A title or null.
122cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1239cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
124cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getTitle() {
125cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle;
126cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
127cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
128cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
129cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a subtitle suitable for display or null.
130cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
131cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A subtitle or null.
132cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1339cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
134cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getSubtitle() {
135cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mSubtitle;
136cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
137cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
138cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
139cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a description suitable for display or null.
140cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
141cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A description or null.
142cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1439cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
144cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getDescription() {
145cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescription;
146cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
147cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
148cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
149cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a bitmap icon suitable for display or null.
150cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
151cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon or null.
152cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1539cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
154cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bitmap getIconBitmap() {
155cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIcon;
156cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
157cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
158cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
159cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a Uri for an icon suitable for display or null.
160cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
161cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon uri or null.
162cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1639cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
164cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Uri getIconUri() {
165cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIconUri;
166cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
167cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
168cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
169cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns any extras that were added to the description.
170cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
171cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A bundle of extras or null.
172cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
1739cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
174cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bundle getExtras() {
175cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mExtras;
176cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
177cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
1789cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    /**
1799cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * Returns a Uri representing this content or null.
1809cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     *
1819cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * @return A media Uri or null.
1829cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     */
1839cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
1849cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    public Uri getMediaUri() {
1859cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        return mMediaUri;
1869cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    }
1879cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake
188cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
189cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public int describeContents() {
190cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return 0;
191cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
192cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
193cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
194cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public void writeToParcel(Parcel dest, int flags) {
195cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (Build.VERSION.SDK_INT < 21) {
196cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeString(mMediaId);
197cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mTitle, dest, flags);
198cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mSubtitle, dest, flags);
199cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mDescription, dest, flags);
200cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIcon, flags);
201cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIconUri, flags);
202cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeBundle(mExtras);
20381f61057e1542008c03d6a85e8ef475d9177149fAndrew Sutherland            dest.writeParcelable(mMediaUri, flags);
204cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        } else {
205cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            MediaDescriptionCompatApi21.writeToParcel(getMediaDescription(), dest, flags);
206cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
207cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
208cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
209cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
210cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String toString() {
211cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle + ", " + mSubtitle + ", " + mDescription;
212cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
213cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
214cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
215cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Gets the underlying framework {@link android.media.MediaDescription}
216cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * object.
217cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
218cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on
219cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later.
220cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
221cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
222cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link android.media.MediaDescription} object, or
223cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         null if none.
224cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
225cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Object getMediaDescription() {
226cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (mDescriptionObj != null || Build.VERSION.SDK_INT < 21) {
227cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return mDescriptionObj;
228cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
229cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        Object bob = MediaDescriptionCompatApi21.Builder.newInstance();
230cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setMediaId(bob, mMediaId);
231cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setTitle(bob, mTitle);
232cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setSubtitle(bob, mSubtitle);
233cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setDescription(bob, mDescription);
234cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconBitmap(bob, mIcon);
235cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconUri(bob, mIconUri);
23601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // Media URI was not added until API 23, so add it to the Bundle of extras to
23701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // ensure the data is not lost - this ensures that
23801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // fromMediaDescription(getMediaDescription(mediaDescriptionCompat)) returns
23901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // an equivalent MediaDescriptionCompat on all API levels
24001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        Bundle extras = mExtras;
24101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        if (Build.VERSION.SDK_INT < 23 && mMediaUri != null) {
24201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            if (extras == null) {
24301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras = new Bundle();
24401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras.putBoolean(DESCRIPTION_KEY_NULL_BUNDLE_FLAG, true);
24501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            }
24601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            extras.putParcelable(DESCRIPTION_KEY_MEDIA_URI, mMediaUri);
24701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        }
24801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        MediaDescriptionCompatApi21.Builder.setExtras(bob, extras);
2499cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        if (Build.VERSION.SDK_INT >= 23) {
2509cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            MediaDescriptionCompatApi23.Builder.setMediaUri(bob, mMediaUri);
2519cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        }
252cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescriptionObj = MediaDescriptionCompatApi21.Builder.build(bob);
253cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
254cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescriptionObj;
255cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
256cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
257cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
258cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Creates an instance from a framework
259cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.media.MediaDescription} object.
260cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
261cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on API 21+.
262cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
263cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
264cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @param descriptionObj A {@link android.media.MediaDescription} object, or
265cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *            null if none.
266cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link MediaMetadataCompat} object, or null if
267cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         none.
268cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
269cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static MediaDescriptionCompat fromMediaDescription(Object descriptionObj) {
270cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (descriptionObj == null || Build.VERSION.SDK_INT < 21) {
271cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return null;
272cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
273cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
274cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        Builder bob = new Builder();
275cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setMediaId(MediaDescriptionCompatApi21.getMediaId(descriptionObj));
276cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setTitle(MediaDescriptionCompatApi21.getTitle(descriptionObj));
277cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setSubtitle(MediaDescriptionCompatApi21.getSubtitle(descriptionObj));
278cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setDescription(MediaDescriptionCompatApi21.getDescription(descriptionObj));
279cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setIconBitmap(MediaDescriptionCompatApi21.getIconBitmap(descriptionObj));
280cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        bob.setIconUri(MediaDescriptionCompatApi21.getIconUri(descriptionObj));
28101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        Bundle extras = MediaDescriptionCompatApi21.getExtras(descriptionObj);
28201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        Uri mediaUri = extras == null ? null :
28301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                (Uri) extras.getParcelable(DESCRIPTION_KEY_MEDIA_URI);
28401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        if (mediaUri != null) {
28501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            if (extras.containsKey(DESCRIPTION_KEY_NULL_BUNDLE_FLAG) && extras.size() == 2) {
28601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // The extras were only created for the media URI, so we set it back to null to
28701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // ensure mediaDescriptionCompat.getExtras() equals
28801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // fromMediaDescription(getMediaDescription(mediaDescriptionCompat)).getExtras()
28901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras = null;
29001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            } else {
29101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // Remove media URI keys to ensure mediaDescriptionCompat.getExtras().keySet()
29201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // equals fromMediaDescription(getMediaDescription(mediaDescriptionCompat))
29301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                // .getExtras().keySet()
29401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras.remove(DESCRIPTION_KEY_MEDIA_URI);
29501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras.remove(DESCRIPTION_KEY_NULL_BUNDLE_FLAG);
29601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            }
29701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        }
29801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        bob.setExtras(extras);
29901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        if (mediaUri != null) {
30001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            bob.setMediaUri(mediaUri);
30101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        } else if (Build.VERSION.SDK_INT >= 23) {
3029cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            bob.setMediaUri(MediaDescriptionCompatApi23.getMediaUri(descriptionObj));
3039cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        }
304cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompat descriptionCompat = bob.build();
305cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        descriptionCompat.mDescriptionObj = descriptionObj;
306cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
307cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return descriptionCompat;
308cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
309cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
310cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final Parcelable.Creator<MediaDescriptionCompat> CREATOR =
311cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            new Parcelable.Creator<MediaDescriptionCompat>() {
312cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
313cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat createFromParcel(Parcel in) {
314cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    if (Build.VERSION.SDK_INT < 21) {
315cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return new MediaDescriptionCompat(in);
316cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    } else {
317cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return fromMediaDescription(MediaDescriptionCompatApi21.fromParcel(in));
318cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    }
319cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
320cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
321cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
322cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat[] newArray(int size) {
323cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    return new MediaDescriptionCompat[size];
324cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
325cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            };
326cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
327cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
328cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Builder for {@link MediaDescriptionCompat} objects.
329cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
330cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final class Builder {
331cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private String mMediaId;
332cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mTitle;
333cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mSubtitle;
334cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mDescription;
335cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bitmap mIcon;
336cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Uri mIconUri;
337cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bundle mExtras;
3389cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        private Uri mMediaUri;
339cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
340cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
341cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates an initially empty builder.
342cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
343cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder() {
344cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
345cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
346cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
347cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the media id.
348cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
349cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param mediaId The unique id for the item or null.
350cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
351cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
3529cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setMediaId(@Nullable String mediaId) {
353cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mMediaId = mediaId;
354cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
355cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
356cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
357cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
358cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the title.
359cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
360cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param title A title suitable for display to the user or null.
361cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
362cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
3639cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setTitle(@Nullable CharSequence title) {
364cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mTitle = title;
365cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
366cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
367cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
368cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
369cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the subtitle.
370cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
371cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param subtitle A subtitle suitable for display to the user or null.
372cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
373cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
3749cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setSubtitle(@Nullable CharSequence subtitle) {
375cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mSubtitle = subtitle;
376cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
377cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
378cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
379cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
380cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the description.
381cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
382cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param description A description suitable for display to the user or
383cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
384cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
385cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
3869cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setDescription(@Nullable CharSequence description) {
387cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mDescription = description;
388cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
389cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
390cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
391cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
392cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon.
393cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
394cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param icon A {@link Bitmap} icon suitable for display to the user or
395cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
396cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
397cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
3989cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setIconBitmap(@Nullable Bitmap icon) {
399cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIcon = icon;
400cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
401cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
402cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
403cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
404cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon uri.
405cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
406cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param iconUri A {@link Uri} for an icon suitable for display to the
407cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            user or null.
408cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
409cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4109cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setIconUri(@Nullable Uri iconUri) {
411cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIconUri = iconUri;
412cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
413cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
414cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
415cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
416cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets a bundle of extras.
417cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
418cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param extras The extras to include with this description or null.
419cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
420cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4219cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setExtras(@Nullable Bundle extras) {
422cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mExtras = extras;
423cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
424cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
425cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
426cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
4279cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * Sets the media uri.
4289cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         *
4299cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * @param mediaUri The content's {@link Uri} for the item or null.
4309cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * @return this
4319cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         */
4329cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setMediaUri(@Nullable Uri mediaUri) {
4339cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            mMediaUri = mediaUri;
4349cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            return this;
4359cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        }
4369cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake
4379cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        /**
438cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates a {@link MediaDescriptionCompat} instance with the specified
439cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * fields.
440cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
441cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return A MediaDescriptionCompat instance.
442cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
443cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public MediaDescriptionCompat build() {
444cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return new MediaDescriptionCompat(mMediaId, mTitle, mSubtitle, mDescription, mIcon,
4459cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake                    mIconUri, mExtras, mMediaUri);
446cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
447cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
448cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik}
449