1package android.media;
2
3import android.annotation.NonNull;
4import android.annotation.Nullable;
5import android.content.ContentResolver;
6import android.content.res.Resources;
7import android.graphics.Bitmap;
8import android.graphics.Canvas;
9import android.graphics.Paint;
10import android.graphics.Point;
11import android.graphics.RectF;
12import android.graphics.drawable.BitmapDrawable;
13import android.graphics.drawable.Drawable;
14import android.net.Uri;
15import android.os.Bundle;
16import android.os.CancellationSignal;
17import android.os.Parcel;
18import android.os.Parcelable;
19import android.util.Size;
20
21/**
22 * A simple set of metadata for a media item suitable for display. This can be
23 * created using the Builder or retrieved from existing metadata using
24 * {@link MediaMetadata#getDescription()}.
25 */
26public class MediaDescription implements Parcelable {
27    /**
28     * A unique persistent id for the content or null.
29     */
30    private final String mMediaId;
31    /**
32     * A primary title suitable for display or null.
33     */
34    private final CharSequence mTitle;
35    /**
36     * A subtitle suitable for display or null.
37     */
38    private final CharSequence mSubtitle;
39    /**
40     * A description suitable for display or null.
41     */
42    private final CharSequence mDescription;
43    /**
44     * A bitmap icon suitable for display or null.
45     */
46    private final Bitmap mIcon;
47    /**
48     * A Uri for an icon suitable for display or null.
49     */
50    private final Uri mIconUri;
51    /**
52     * Extras for opaque use by apps/system.
53     */
54    private final Bundle mExtras;
55
56    private MediaDescription(String mediaId, CharSequence title, CharSequence subtitle,
57            CharSequence description, Bitmap icon, Uri iconUri, Bundle extras) {
58        mMediaId = mediaId;
59        mTitle = title;
60        mSubtitle = subtitle;
61        mDescription = description;
62        mIcon = icon;
63        mIconUri = iconUri;
64        mExtras = extras;
65    }
66
67    private MediaDescription(Parcel in) {
68        mMediaId = in.readString();
69        mTitle = in.readCharSequence();
70        mSubtitle = in.readCharSequence();
71        mDescription = in.readCharSequence();
72        mIcon = in.readParcelable(null);
73        mIconUri = in.readParcelable(null);
74        mExtras = in.readBundle();
75    }
76
77    /**
78     * Returns the media id or null. See
79     * {@link MediaMetadata#METADATA_KEY_MEDIA_ID}.
80     */
81    public @Nullable String getMediaId() {
82        return mMediaId;
83    }
84
85    /**
86     * Returns a title suitable for display or null.
87     *
88     * @return A title or null.
89     */
90    public @Nullable CharSequence getTitle() {
91        return mTitle;
92    }
93
94    /**
95     * Returns a subtitle suitable for display or null.
96     *
97     * @return A subtitle or null.
98     */
99    public @Nullable CharSequence getSubtitle() {
100        return mSubtitle;
101    }
102
103    /**
104     * Returns a description suitable for display or null.
105     *
106     * @return A description or null.
107     */
108    public @Nullable CharSequence getDescription() {
109        return mDescription;
110    }
111
112    /**
113     * Returns a bitmap icon suitable for display or null.
114     *
115     * @return An icon or null.
116     */
117    public @Nullable Bitmap getIconBitmap() {
118        return mIcon;
119    }
120
121    /**
122     * Returns a Uri for an icon suitable for display or null.
123     *
124     * @return An icon uri or null.
125     */
126    public @Nullable Uri getIconUri() {
127        return mIconUri;
128    }
129
130    /**
131     * Returns any extras that were added to the description.
132     *
133     * @return A bundle of extras or null.
134     */
135    public @Nullable Bundle getExtras() {
136        return mExtras;
137    }
138
139    @Override
140    public int describeContents() {
141        return 0;
142    }
143
144    @Override
145    public void writeToParcel(Parcel dest, int flags) {
146        dest.writeString(mMediaId);
147        dest.writeCharSequence(mTitle);
148        dest.writeCharSequence(mSubtitle);
149        dest.writeCharSequence(mDescription);
150        dest.writeParcelable(mIcon, flags);
151        dest.writeParcelable(mIconUri, flags);
152        dest.writeBundle(mExtras);
153    }
154
155    @Override
156    public String toString() {
157        return mTitle + ", " + mSubtitle + ", " + mDescription;
158    }
159
160    public static final Parcelable.Creator<MediaDescription> CREATOR =
161            new Parcelable.Creator<MediaDescription>() {
162                @Override
163                public MediaDescription createFromParcel(Parcel in) {
164                    return new MediaDescription(in);
165                }
166
167                @Override
168                public MediaDescription[] newArray(int size) {
169                    return new MediaDescription[size];
170                }
171            };
172
173    /**
174     * Builder for {@link MediaDescription} objects.
175     */
176    public static class Builder {
177        private String mMediaId;
178        private CharSequence mTitle;
179        private CharSequence mSubtitle;
180        private CharSequence mDescription;
181        private Bitmap mIcon;
182        private Uri mIconUri;
183        private Bundle mExtras;
184
185        /**
186         * Creates an initially empty builder.
187         */
188        public Builder() {
189        }
190
191        /**
192         * Sets the media id.
193         *
194         * @param mediaId The unique id for the item or null.
195         * @return this
196         */
197        public Builder setMediaId(@Nullable String mediaId) {
198            mMediaId = mediaId;
199            return this;
200        }
201
202        /**
203         * Sets the title.
204         *
205         * @param title A title suitable for display to the user or null.
206         * @return this
207         */
208        public Builder setTitle(@Nullable CharSequence title) {
209            mTitle = title;
210            return this;
211        }
212
213        /**
214         * Sets the subtitle.
215         *
216         * @param subtitle A subtitle suitable for display to the user or null.
217         * @return this
218         */
219        public Builder setSubtitle(@Nullable CharSequence subtitle) {
220            mSubtitle = subtitle;
221            return this;
222        }
223
224        /**
225         * Sets the description.
226         *
227         * @param description A description suitable for display to the user or
228         *            null.
229         * @return this
230         */
231        public Builder setDescription(@Nullable CharSequence description) {
232            mDescription = description;
233            return this;
234        }
235
236        /**
237         * Sets the icon.
238         *
239         * @param icon A {@link Bitmap} icon suitable for display to the user or
240         *            null.
241         * @return this
242         */
243        public Builder setIconBitmap(@Nullable Bitmap icon) {
244            mIcon = icon;
245            return this;
246        }
247
248        /**
249         * Sets the icon uri.
250         *
251         * @param iconUri A {@link Uri} for an icon suitable for display to the
252         *            user or null.
253         * @return this
254         */
255        public Builder setIconUri(@Nullable Uri iconUri) {
256            mIconUri = iconUri;
257            return this;
258        }
259
260        /**
261         * Sets a bundle of extras.
262         *
263         * @param extras The extras to include with this description or null.
264         * @return this
265         */
266        public Builder setExtras(@Nullable Bundle extras) {
267            mExtras = extras;
268            return this;
269        }
270
271        public MediaDescription build() {
272            return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri,
273                    mExtras);
274        }
275    }
276}
277