11040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn/**
21040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * Copyright (c) 2010, The Android Open Source Project
31040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn *
41040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
51040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * you may not use this file except in compliance with the License.
61040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * You may obtain a copy of the License at
71040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn *
81040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn *     http://www.apache.org/licenses/LICENSE-2.0
91040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn *
101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * See the License for the specific language governing permissions and
141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * limitations under the License.
151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn */
161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornpackage android.content;
181040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport android.os.Parcel;
201040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport android.os.Parcelable;
21ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheevimport android.os.PersistableBundle;
221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport android.text.TextUtils;
2309971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shankaimport android.util.TimeUtils;
241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport java.util.ArrayList;
268e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheevimport java.util.Arrays;
271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn/**
29f6d952bbc85706031e1ad29ec389c1e02cfff433Dianne Hackborn * Meta-data describing the contents of a {@link ClipData}.  Provides enough
301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * information to know if you can handle the ClipData, but not the data
311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * itself.
323aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
333aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
343aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
353aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using the clipboard framework, read the
363aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a>
373aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p>
383aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn */
401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornpublic class ClipDescription implements Parcelable {
411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding plain text.
431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
47acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     * The MIME type for a clip holding HTML text.
48acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     */
49acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    public static final String MIMETYPE_TEXT_HTML = "text/html";
50acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn
51acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    /**
521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding one or more URIs.  This should be
531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * used for URIs that are meaningful to a user (such as an http: URI).
541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * It should <em>not</em> be used for a content: URI that references some
551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * other piece of data; in that case the MIME type should be the type
561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * of the referenced data.
571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding an Intent.
621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
65ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
66ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * The name of the extra used to define a component name when copying/dragging
67ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * an app icon from Launcher.
68ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
69ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Type: String
70ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
71ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
72ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Use {@link ComponentName#unflattenFromString(String)}
73ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * and {@link ComponentName#flattenToString()} to convert the extra value
74ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * to/from {@link ComponentName}.
75ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
765d196673b8d940b9420cfdb12c2d6d75460b818cVladislav Kaznacheev     * @hide
77ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
78ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public static final String EXTRA_TARGET_COMPONENT_NAME =
79ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            "android.content.extra.TARGET_COMPONENT_NAME";
80ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
81ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
82ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * The name of the extra used to define a user serial number when copying/dragging
83ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * an app icon from Launcher.
84ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
85ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Type: long
86ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
875d196673b8d940b9420cfdb12c2d6d75460b818cVladislav Kaznacheev     * @hide
88ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
89ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public static final String EXTRA_USER_SERIAL_NUMBER =
90ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            "android.content.extra.USER_SERIAL_NUMBER";
91ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
92ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final CharSequence mLabel;
948e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev    private final ArrayList<String> mMimeTypes;
95ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    private PersistableBundle mExtras;
9609971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    private long mTimeStamp;
971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a new clip.
1001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param label Label to show to the user describing this clip.
1021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeTypes An array of MIME types this data is available as.
1031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(CharSequence label, String[] mimeTypes) {
1051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mimeTypes == null) {
1061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("mimeTypes is null");
1071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = label;
1098e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        mMimeTypes = new ArrayList<String>(Arrays.asList(mimeTypes));
1101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a copy of a ClipDescription.
1141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(ClipDescription o) {
1161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = o.mLabel;
1178e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        mMimeTypes = new ArrayList<String>(o.mMimeTypes);
11809971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        mTimeStamp = o.mTimeStamp;
1191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1201040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Helper to compare two MIME types, where one may be a pattern.
1231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param concreteType A fully-specified MIME type.
1243390018c6b45acffa6edf97a4174ca49f1e8c76dJohn Spurlock     * @param desiredType A desired MIME type that may be a pattern such as *&#47;*.
1251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if the two MIME types match.
1261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static boolean compareMimeTypes(String concreteType, String desiredType) {
1281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int typeLength = desiredType.length();
1291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (typeLength == 3 && desiredType.equals("*/*")) {
1301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return true;
1311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int slashpos = desiredType.indexOf('/');
1341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (slashpos > 0) {
1351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (typeLength == slashpos+2 && desiredType.charAt(slashpos+1) == '*') {
1361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (desiredType.regionMatches(0, concreteType, 0, slashpos+1)) {
1371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    return true;
1381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            } else if (desiredType.equals(concreteType)) {
1401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
14809971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     * Used for setting the timestamp at which the associated {@link ClipData} is copied to
14909971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     * global clipboard.
15009971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     *
151e9ee7f2cb5e33fbc7eec7d30f221168c852f2d63Sudheer Shanka     * @param timeStamp at which the associated {@link ClipData} is copied to clipboard in
152c8201910613a374e9c075c64dca2a0fe377250d0Sudheer Shanka     *                  {@link System#currentTimeMillis()} time base.
15309971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     * @hide
15409971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     */
15509971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    public void setTimestamp(long timeStamp) {
15609971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        mTimeStamp = timeStamp;
15709971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    }
15809971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka
15909971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    /**
16009971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     * Return the timestamp at which the associated {@link ClipData} is copied to global clipboard
161c8201910613a374e9c075c64dca2a0fe377250d0Sudheer Shanka     * in the {@link System#currentTimeMillis()} time base.
16209971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     *
16309971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     * @return timestamp at which the associated {@link ClipData} is copied to global clipboard
16409971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     *         or {@code 0} if it is not copied to clipboard.
16509971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka     */
16609971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    public long getTimestamp() {
16709971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        return mTimeStamp;
16809971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    }
16909971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka
17009971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka    /**
1711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the label for this clip.
1721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public CharSequence getLabel() {
1741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mLabel;
1751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Check whether the clip description contains the given MIME type.
1791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if one of the MIME types in the clip description
1821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matches the desired MIME type, else false.
1831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public boolean hasMimeType(String mimeType) {
1858e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        final int size = mMimeTypes.size();
1868e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        for (int i=0; i<size; i++) {
1878e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            if (compareMimeTypes(mMimeTypes.get(i), mimeType)) {
1881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Filter the clip description MIME types by the given MIME type.  Returns
1961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * all MIME types in the clip that match the given MIME type.
1971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns an array of all matching MIME types.  If there are no
2001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matching MIME types, null is returned.
2011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
2021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String[] filterMimeTypes(String mimeType) {
2031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        ArrayList<String> array = null;
2048e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        final int size = mMimeTypes.size();
2058e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        for (int i=0; i<size; i++) {
2068e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            if (compareMimeTypes(mMimeTypes.get(i), mimeType)) {
2071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (array == null) {
2081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    array = new ArrayList<String>();
2091040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
2108e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev                array.add(mMimeTypes.get(i));
2111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (array == null) {
2141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return null;
2151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        String[] rawArray = new String[array.size()];
2171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        array.toArray(rawArray);
2181040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return rawArray;
2191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2201040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
2221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the number of MIME types the clip is available in.
2231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
2241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int getMimeTypeCount() {
2258e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        return mMimeTypes.size();
2261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
2291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return one of the possible clip MIME types.
2301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
2311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String getMimeType(int index) {
2328e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        return mMimeTypes.get(index);
2338e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev    }
2348e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev
2358e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev    /**
2368e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev     * Add MIME types to the clip description.
2378e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev     */
2388e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev    void addMimeTypes(String[] mimeTypes) {
2398e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        for (int i=0; i!=mimeTypes.length; i++) {
2408e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            final String mimeType = mimeTypes[i];
2418e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            if (!mMimeTypes.contains(mimeType)) {
2428e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev                mMimeTypes.add(mimeType);
2438e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            }
2448e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        }
2451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
247ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
248ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Retrieve extended data from the clip description.
249ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
250ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @return the bundle containing extended data previously set with
251ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * {@link #setExtras(PersistableBundle)}, or null if no extras have been set.
252ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
253ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @see #setExtras(PersistableBundle)
254ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
255ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public PersistableBundle getExtras() {
256ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        return mExtras;
257ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    }
258ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
259ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
260ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Add extended data to the clip description.
261ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
262ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @see #getExtras()
263ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
264ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public void setExtras(PersistableBundle extras) {
265ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        mExtras = new PersistableBundle(extras);
266ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    }
267ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
2681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /** @hide */
2691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void validate() {
2701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes == null) {
2711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("null mime types");
2721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2738e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        final int size = mMimeTypes.size();
2748e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        if (size <= 0) {
2751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new IllegalArgumentException("must have at least 1 mime type");
2761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2778e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        for (int i=0; i<size; i++) {
2788e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            if (mMimeTypes.get(i) == null) {
2791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                throw new NullPointerException("mime type at " + i + " is null");
2801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
28521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public String toString() {
28621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        StringBuilder b = new StringBuilder(128);
28721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
28821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append("ClipDescription { ");
28921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        toShortString(b);
29021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append(" }");
29121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
29221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return b.toString();
29321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
29421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
29521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    /** @hide */
29621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public boolean toShortString(StringBuilder b) {
297ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        boolean first = !toShortStringTypesOnly(b);
298ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        if (mLabel != null) {
29921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
30021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
30121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
30221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
303ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append('"');
304ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append(mLabel);
305ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append('"');
30621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
307ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        if (mExtras != null) {
308ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            if (!first) {
309ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev                b.append(' ');
310ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            }
311ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            first = false;
312ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            b.append(mExtras.toString());
313ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        }
31409971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        if (mTimeStamp > 0) {
31509971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka            if (!first) {
31609971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka                b.append(' ');
31709971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka            }
31809971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka            first = false;
319c8201910613a374e9c075c64dca2a0fe377250d0Sudheer Shanka            b.append('<');
320c8201910613a374e9c075c64dca2a0fe377250d0Sudheer Shanka            b.append(TimeUtils.logTimeOfDay(mTimeStamp));
321c8201910613a374e9c075c64dca2a0fe377250d0Sudheer Shanka            b.append('>');
32209971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        }
323ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        return !first;
324ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    }
325ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn
326ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    /** @hide */
327ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    public boolean toShortStringTypesOnly(StringBuilder b) {
328ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        boolean first = true;
3298e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        final int size = mMimeTypes.size();
3308e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        for (int i=0; i<size; i++) {
33121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
33221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
33321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
33421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
3358e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev            b.append(mMimeTypes.get(i));
33621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
33721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return !first;
33821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
33921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
34021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    @Override
3411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int describeContents() {
3421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return 0;
3431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
3441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
3461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
3471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        TextUtils.writeToParcel(mLabel, dest, flags);
3488e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        dest.writeStringList(mMimeTypes);
349ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        dest.writePersistableBundle(mExtras);
35009971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        dest.writeLong(mTimeStamp);
3511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
3521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    ClipDescription(Parcel in) {
3541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
3558e7b940f8d08fe6697e274933ba8c06e6363c295Vladislav Kaznacheev        mMimeTypes = in.createStringArrayList();
356ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        mExtras = in.readPersistableBundle();
35709971befd7e5eb506eca65afd61bd9248b78c723Sudheer Shanka        mTimeStamp = in.readLong();
3581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
3591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final Parcelable.Creator<ClipDescription> CREATOR =
3611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        new Parcelable.Creator<ClipDescription>() {
3621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription createFromParcel(Parcel source) {
3641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription(source);
3651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
3661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription[] newArray(int size) {
3681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription[size];
3691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
3701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        };
3711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn}
372