MediaDescriptionCompat.java revision 89febf83e2bd3720923474006bcdf6c91a3b88f2
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
18ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas
20cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.graphics.Bitmap;
21cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.net.Uri;
22cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Build;
23cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Bundle;
24cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Parcel;
25cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.os.Parcelable;
26cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikimport android.text.TextUtils;
27cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
2889febf83e2bd3720923474006bcdf6c91a3b88f2Aurimas Liutikasimport androidx.annotation.Nullable;
2989febf83e2bd3720923474006bcdf6c91a3b88f2Aurimas Liutikasimport androidx.annotation.RestrictTo;
30ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.media.MediaBrowserCompat;
31ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas
32cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik/**
33cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * A simple set of metadata for a media item suitable for display. This can be
34cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * created using the Builder or retrieved from existing metadata using
35cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik * {@link MediaMetadataCompat#getDescription()}.
36cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik */
37cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErikpublic final class MediaDescriptionCompat implements Parcelable {
38cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
398b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * Used as a long extra field to indicate the bluetooth folder type of the media item as
408b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * specified in the section 6.10.2.2 of the Bluetooth AVRCP 1.5. This is valid only for
418b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * {@link MediaBrowserCompat.MediaItem} with
428b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * {@link MediaBrowserCompat.MediaItem#FLAG_BROWSABLE}. The value should be one of the
438b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * following:
448b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <ul>
458b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_MIXED}</li>
468b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_TITLES}</li>
478b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_ALBUMS}</li>
488b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_ARTISTS}</li>
498b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_GENRES}</li>
508b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_PLAYLISTS}</li>
518b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * <li>{@link #BT_FOLDER_TYPE_YEARS}</li>
528b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * </ul>
538b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     *
548b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * @see #getExtras()
558b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
568b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final String EXTRA_BT_FOLDER_TYPE = "android.media.extra.BT_FOLDER_TYPE";
578b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
588b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
598b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that is unknown or contains media elements of mixed types as specified in
608b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * the section 6.10.2.2 of the Bluetooth AVRCP 1.5.
618b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
628b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_MIXED = 0;
638b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
648b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
658b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains media elements only as specified in the section 6.10.2.2 of
668b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * the Bluetooth AVRCP 1.5.
678b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
688b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_TITLES = 1;
698b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
708b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
718b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains folders categorized by album as specified in the section
728b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * 6.10.2.2 of the Bluetooth AVRCP 1.5.
738b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
748b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_ALBUMS = 2;
758b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
768b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
778b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains folders categorized by artist as specified in the section
788b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * 6.10.2.2 of the Bluetooth AVRCP 1.5.
798b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
808b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_ARTISTS = 3;
818b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
828b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
838b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains folders categorized by genre as specified in the section
848b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * 6.10.2.2 of the Bluetooth AVRCP 1.5.
858b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
868b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_GENRES = 4;
878b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
888b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
898b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains folders categorized by playlist as specified in the section
908b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * 6.10.2.2 of the Bluetooth AVRCP 1.5.
918b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
928b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_PLAYLISTS = 5;
938b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
948b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
958b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * The type of folder that contains folders categorized by year as specified in the section
968b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     * 6.10.2.2 of the Bluetooth AVRCP 1.5.
978b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho     */
988b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    public static final long BT_FOLDER_TYPE_YEARS = 6;
998b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho
1008b663a24c352adb2a5dcacffed4d1e5b1cadaf99Donghyun Cho    /**
101b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * Used as a long extra field to indicate the download status of the media item. The value
102b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * should be one of the following:
103b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * <ul>
104b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * <li>{@link #STATUS_NOT_DOWNLOADED}</li>
105b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * <li>{@link #STATUS_DOWNLOADING}</li>
106b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * <li>{@link #STATUS_DOWNLOADED}</li>
107b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * </ul>
108b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     *
109b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * @see #getExtras()
110b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     */
111b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    public static final String EXTRA_DOWNLOAD_STATUS = "android.media.extra.DOWNLOAD_STATUS";
112b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho
113b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    /**
114b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * The status value to indicate the media item is not downloaded.
115b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     *
116b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * @see #EXTRA_DOWNLOAD_STATUS
117b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     */
118b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    public static final long STATUS_NOT_DOWNLOADED = 0;
119b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho
120b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    /**
121b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * The status value to indicate the media item is being downloaded.
122b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     *
123b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * @see #EXTRA_DOWNLOAD_STATUS
124b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     */
125b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    public static final long STATUS_DOWNLOADING = 1;
126b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho
127b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    /**
128b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * The status value to indicate the media item is downloaded for later offline playback.
129b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     *
130b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     * @see #EXTRA_DOWNLOAD_STATUS
131b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho     */
132b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    public static final long STATUS_DOWNLOADED = 2;
133b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho
134b78a7edc82d18094e93383f96b161f267a976f3eDonghyun Cho    /**
13501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * Custom key to store a media URI on API 21-22 devices (before it became part of the
13601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * framework class) when parceling/converting to and from framework objects.
13701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     *
13801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * @hide
13901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     */
1408e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
14101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    public static final String DESCRIPTION_KEY_MEDIA_URI =
14201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            "android.support.v4.media.description.MEDIA_URI";
14301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    /**
14401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * Custom key to store whether the original Bundle provided by the developer was null
14501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     *
14601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     * @hide
14701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake     */
1488e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas    @RestrictTo(LIBRARY_GROUP)
14901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    public static final String DESCRIPTION_KEY_NULL_BUNDLE_FLAG =
15001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            "android.support.v4.media.description.NULL_BUNDLE_FLAG";
15101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake    /**
152cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A unique persistent id for the content or null.
153cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
154cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final String mMediaId;
155cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
156cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A primary title suitable for display or null.
157cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
158cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mTitle;
159cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
160cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A subtitle suitable for display or null.
161cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
162cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mSubtitle;
163cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
164cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A description suitable for display or null.
165cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
166cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final CharSequence mDescription;
167cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
168cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A bitmap icon suitable for display or null.
169cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
170cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bitmap mIcon;
171cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
172cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A Uri for an icon suitable for display or null.
173cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
174cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Uri mIconUri;
175cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
176cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Extras for opaque use by apps/system.
177cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
178cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private final Bundle mExtras;
1799cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    /**
1809cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * A Uri to identify this content.
1819cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     */
1829cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    private final Uri mMediaUri;
183cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
184cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
185cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * A cached copy of the equivalent framework object.
186cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
187cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    private Object mDescriptionObj;
188cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
189b768ed3824de2c109411654b3830feabe564ff0aAurimas Liutikas    MediaDescriptionCompat(String mediaId, CharSequence title, CharSequence subtitle,
1909cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            CharSequence description, Bitmap icon, Uri iconUri, Bundle extras, Uri mediaUri) {
191cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = mediaId;
192cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = title;
193cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = subtitle;
194cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = description;
195cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = icon;
196cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = iconUri;
197cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = extras;
1989cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        mMediaUri = mediaUri;
199cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
200cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
201b768ed3824de2c109411654b3830feabe564ff0aAurimas Liutikas    MediaDescriptionCompat(Parcel in) {
202cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mMediaId = in.readString();
203cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
204cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
205cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
206cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIcon = in.readParcelable(null);
207cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mIconUri = in.readParcelable(null);
208cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mExtras = in.readBundle();
2099cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        mMediaUri = in.readParcelable(null);
210cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
211cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
212cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
213cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns the media id or null. See
214cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link MediaMetadataCompat#METADATA_KEY_MEDIA_ID}.
215cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2169cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
217cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String getMediaId() {
218cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mMediaId;
219cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
220cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
221cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
222cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a title suitable for display or null.
223cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
224cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A title or null.
225cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2269cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
227cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getTitle() {
228cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle;
229cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
230cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
231cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
232cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a subtitle suitable for display or null.
233cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
234cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A subtitle or null.
235cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2369cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
237cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getSubtitle() {
238cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mSubtitle;
239cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
240cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
241cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
242cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a description suitable for display or null.
243cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
244cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A description or null.
245cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2469cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
247cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public CharSequence getDescription() {
248cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescription;
249cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
250cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
251cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
252cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a bitmap icon suitable for display or null.
253cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
254cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon or null.
255cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2569cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
257cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bitmap getIconBitmap() {
258cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIcon;
259cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
260cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
261cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
262cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns a Uri for an icon suitable for display or null.
263cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
264cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An icon uri or null.
265cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2669cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
267cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Uri getIconUri() {
268cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mIconUri;
269cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
270cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
271cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
272cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Returns any extras that were added to the description.
273cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
274cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return A bundle of extras or null.
275cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
2769cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
277cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Bundle getExtras() {
278cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mExtras;
279cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
280cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
2819cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    /**
2829cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * Returns a Uri representing this content or null.
2839cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     *
2849cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     * @return A media Uri or null.
2859cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake     */
2869cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    @Nullable
2879cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    public Uri getMediaUri() {
2889cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        return mMediaUri;
2899cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake    }
2909cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake
291cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
292cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public int describeContents() {
293cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return 0;
294cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
295cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
296cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
297cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public void writeToParcel(Parcel dest, int flags) {
298cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (Build.VERSION.SDK_INT < 21) {
299cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeString(mMediaId);
300cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mTitle, dest, flags);
301cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mSubtitle, dest, flags);
302cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            TextUtils.writeToParcel(mDescription, dest, flags);
303cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIcon, flags);
304cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeParcelable(mIconUri, flags);
305cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            dest.writeBundle(mExtras);
30681f61057e1542008c03d6a85e8ef475d9177149fAndrew Sutherland            dest.writeParcelable(mMediaUri, flags);
307cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        } else {
308cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            MediaDescriptionCompatApi21.writeToParcel(getMediaDescription(), dest, flags);
309cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
310cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
311cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
312cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    @Override
313cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public String toString() {
314cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mTitle + ", " + mSubtitle + ", " + mDescription;
315cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
316cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
317cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
318cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Gets the underlying framework {@link android.media.MediaDescription}
319cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * object.
320cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
321cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on
322cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later.
323cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
324cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
325cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link android.media.MediaDescription} object, or
326cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         null if none.
327cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
328cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public Object getMediaDescription() {
329cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        if (mDescriptionObj != null || Build.VERSION.SDK_INT < 21) {
330cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return mDescriptionObj;
331cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
332cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        Object bob = MediaDescriptionCompatApi21.Builder.newInstance();
333cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setMediaId(bob, mMediaId);
334cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setTitle(bob, mTitle);
335cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setSubtitle(bob, mSubtitle);
336cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setDescription(bob, mDescription);
337cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconBitmap(bob, mIcon);
338cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        MediaDescriptionCompatApi21.Builder.setIconUri(bob, mIconUri);
33901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // Media URI was not added until API 23, so add it to the Bundle of extras to
34001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // ensure the data is not lost - this ensures that
34101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // fromMediaDescription(getMediaDescription(mediaDescriptionCompat)) returns
34201ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        // an equivalent MediaDescriptionCompat on all API levels
34301ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        Bundle extras = mExtras;
34401ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        if (Build.VERSION.SDK_INT < 23 && mMediaUri != null) {
34501ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            if (extras == null) {
34601ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras = new Bundle();
34701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake                extras.putBoolean(DESCRIPTION_KEY_NULL_BUNDLE_FLAG, true);
34801ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            }
34901ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            extras.putParcelable(DESCRIPTION_KEY_MEDIA_URI, mMediaUri);
35001ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        }
35101ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake        MediaDescriptionCompatApi21.Builder.setExtras(bob, extras);
3529cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        if (Build.VERSION.SDK_INT >= 23) {
3539cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            MediaDescriptionCompatApi23.Builder.setMediaUri(bob, mMediaUri);
3549cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        }
355cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        mDescriptionObj = MediaDescriptionCompatApi21.Builder.build(bob);
356cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
357cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        return mDescriptionObj;
358cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
359cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
360cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
361cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Creates an instance from a framework
362cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * {@link android.media.MediaDescription} object.
363cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * <p>
364cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * This method is only supported on API 21+.
365cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * </p>
366cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *
367cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @param descriptionObj A {@link android.media.MediaDescription} object, or
368cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *            null if none.
369cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * @return An equivalent {@link MediaMetadataCompat} object, or null if
370cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     *         none.
371cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
372cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static MediaDescriptionCompat fromMediaDescription(Object descriptionObj) {
373c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        if (descriptionObj != null && Build.VERSION.SDK_INT >= 21) {
374c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            Builder bob = new Builder();
375c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setMediaId(MediaDescriptionCompatApi21.getMediaId(descriptionObj));
376c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setTitle(MediaDescriptionCompatApi21.getTitle(descriptionObj));
377c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setSubtitle(MediaDescriptionCompatApi21.getSubtitle(descriptionObj));
378c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setDescription(MediaDescriptionCompatApi21.getDescription(descriptionObj));
379c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setIconBitmap(MediaDescriptionCompatApi21.getIconBitmap(descriptionObj));
380c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setIconUri(MediaDescriptionCompatApi21.getIconUri(descriptionObj));
381c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            Bundle extras = MediaDescriptionCompatApi21.getExtras(descriptionObj);
382c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            Uri mediaUri = extras == null ? null :
383c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    (Uri) extras.getParcelable(DESCRIPTION_KEY_MEDIA_URI);
384c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            if (mediaUri != null) {
385c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                if (extras.containsKey(DESCRIPTION_KEY_NULL_BUNDLE_FLAG) && extras.size() == 2) {
386c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // The extras were only created for the media URI, so we set it back to null to
387c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // ensure mediaDescriptionCompat.getExtras() equals
388c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // fromMediaDescription(getMediaDescription(mediaDescriptionCompat)).getExtras()
389c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    extras = null;
390c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                } else {
391c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // Remove media URI keys to ensure mediaDescriptionCompat.getExtras().keySet()
392c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // equals fromMediaDescription(getMediaDescription(mediaDescriptionCompat))
393c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    // .getExtras().keySet()
394c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    extras.remove(DESCRIPTION_KEY_MEDIA_URI);
395c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                    extras.remove(DESCRIPTION_KEY_NULL_BUNDLE_FLAG);
396c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                }
39701ce79ae5cba1be3859bf520d2186c882631fca5Ian Lake            }
398c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            bob.setExtras(extras);
399c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            if (mediaUri != null) {
400c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                bob.setMediaUri(mediaUri);
401c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            } else if (Build.VERSION.SDK_INT >= 23) {
402c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette                bob.setMediaUri(MediaDescriptionCompatApi23.getMediaUri(descriptionObj));
403c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            }
404c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            MediaDescriptionCompat descriptionCompat = bob.build();
405c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            descriptionCompat.mDescriptionObj = descriptionObj;
406cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
407c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            return descriptionCompat;
408c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        } else {
409c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette            return null;
410c69882cb9b130902c1554ef5d3e3b06d776cd796Alan Viverette        }
411cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
412cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
413cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final Parcelable.Creator<MediaDescriptionCompat> CREATOR =
414cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            new Parcelable.Creator<MediaDescriptionCompat>() {
415cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
416cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat createFromParcel(Parcel in) {
417cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    if (Build.VERSION.SDK_INT < 21) {
418cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return new MediaDescriptionCompat(in);
419cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    } else {
420cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                        return fromMediaDescription(MediaDescriptionCompatApi21.fromParcel(in));
421cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    }
422cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
423cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
424cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            @Override
425cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                public MediaDescriptionCompat[] newArray(int size) {
426cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                    return new MediaDescriptionCompat[size];
427cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik                }
428cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            };
429cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
430cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    /**
431cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     * Builder for {@link MediaDescriptionCompat} objects.
432cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik     */
433cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    public static final class Builder {
434cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private String mMediaId;
435cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mTitle;
436cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mSubtitle;
437cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private CharSequence mDescription;
438cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bitmap mIcon;
439cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Uri mIconUri;
440cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        private Bundle mExtras;
4419cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        private Uri mMediaUri;
442cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
443cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
444cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates an initially empty builder.
445cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
446cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public Builder() {
447cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
448cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
449cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
450cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the media id.
451cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
452cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param mediaId The unique id for the item or null.
453cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
454cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4559cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setMediaId(@Nullable String mediaId) {
456cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mMediaId = mediaId;
457cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
458cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
459cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
460cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
461cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the title.
462cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
463cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param title A title suitable for display to the user or null.
464cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
465cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4669cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setTitle(@Nullable CharSequence title) {
467cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mTitle = title;
468cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
469cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
470cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
471cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
472cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the subtitle.
473cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
474cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param subtitle A subtitle suitable for display to the user or null.
475cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
476cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4779cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setSubtitle(@Nullable CharSequence subtitle) {
478cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mSubtitle = subtitle;
479cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
480cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
481cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
482cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
483cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the description.
484cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
485cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param description A description suitable for display to the user or
486cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
487cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
488cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
4899cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setDescription(@Nullable CharSequence description) {
490cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mDescription = description;
491cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
492cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
493cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
494cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
495cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon.
496cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
497cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param icon A {@link Bitmap} icon suitable for display to the user or
498cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            null.
499cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
500cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
5019cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setIconBitmap(@Nullable Bitmap icon) {
502cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIcon = icon;
503cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
504cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
505cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
506cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
507cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets the icon uri.
508cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
509cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param iconUri A {@link Uri} for an icon suitable for display to the
510cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *            user or null.
511cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
512cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
5139cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setIconUri(@Nullable Uri iconUri) {
514cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mIconUri = iconUri;
515cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
516cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
517cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
518cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
519cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Sets a bundle of extras.
520cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
521cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @param extras The extras to include with this description or null.
522cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return this
523cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
5249cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setExtras(@Nullable Bundle extras) {
525cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            mExtras = extras;
526cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return this;
527cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
528cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik
529cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        /**
5309cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * Sets the media uri.
5319cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         *
5329cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * @param mediaUri The content's {@link Uri} for the item or null.
5339cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         * @return this
5349cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake         */
5359cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        public Builder setMediaUri(@Nullable Uri mediaUri) {
5369cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            mMediaUri = mediaUri;
5379cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake            return this;
5389cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        }
5399cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake
5409cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake        /**
541cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * Creates a {@link MediaDescriptionCompat} instance with the specified
542cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * fields.
543cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         *
544cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         * @return A MediaDescriptionCompat instance.
545cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik         */
546cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        public MediaDescriptionCompat build() {
547cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik            return new MediaDescriptionCompat(mMediaId, mTitle, mSubtitle, mDescription, mIcon,
5489cdd87d08a3295f5f973b70008840d6bf8de8aa1Ian Lake                    mIconUri, mExtras, mMediaUri);
549cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik        }
550cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik    }
551cf9daf1b11f55ecb9f4008cd1c7af2c8dac990afRoboErik}
552