ClipDescription.java revision 5d196673b8d940b9420cfdb12c2d6d75460b818c
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;
231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport java.util.ArrayList;
251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn/**
27f6d952bbc85706031e1ad29ec389c1e02cfff433Dianne Hackborn * Meta-data describing the contents of a {@link ClipData}.  Provides enough
281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * information to know if you can handle the ClipData, but not the data
291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * itself.
303aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
313aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
323aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
333aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using the clipboard framework, read the
343aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a>
353aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p>
363aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn */
381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornpublic class ClipDescription implements Parcelable {
391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding plain text.
411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
45acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     * The MIME type for a clip holding HTML text.
46acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     */
47acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    public static final String MIMETYPE_TEXT_HTML = "text/html";
48acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn
49acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    /**
501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding one or more URIs.  This should be
511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * used for URIs that are meaningful to a user (such as an http: URI).
521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * It should <em>not</em> be used for a content: URI that references some
531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * other piece of data; in that case the MIME type should be the type
541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * of the referenced data.
551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding an Intent.
601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
63ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
64ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * The name of the extra used to define a component name when copying/dragging
65ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * an app icon from Launcher.
66ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
67ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Type: String
68ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
69ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
70ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Use {@link ComponentName#unflattenFromString(String)}
71ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * and {@link ComponentName#flattenToString()} to convert the extra value
72ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * to/from {@link ComponentName}.
73ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
745d196673b8d940b9420cfdb12c2d6d75460b818cVladislav Kaznacheev     * @hide
75ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
76ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public static final String EXTRA_TARGET_COMPONENT_NAME =
77ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            "android.content.extra.TARGET_COMPONENT_NAME";
78ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
79ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
80ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * The name of the extra used to define a user serial number when copying/dragging
81ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * an app icon from Launcher.
82ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * <p>
83ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Type: long
84ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * </p>
855d196673b8d940b9420cfdb12c2d6d75460b818cVladislav Kaznacheev     * @hide
86ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
87ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public static final String EXTRA_USER_SERIAL_NUMBER =
88ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            "android.content.extra.USER_SERIAL_NUMBER";
89ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
90ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final CharSequence mLabel;
921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final String[] mMimeTypes;
93ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    private PersistableBundle mExtras;
941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a new clip.
971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param label Label to show to the user describing this clip.
991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeTypes An array of MIME types this data is available as.
1001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(CharSequence label, String[] mimeTypes) {
1021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mimeTypes == null) {
1031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("mimeTypes is null");
1041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = label;
1061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = mimeTypes;
1071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1091040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a copy of a ClipDescription.
1111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(ClipDescription o) {
1131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = o.mLabel;
1141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = o.mMimeTypes;
1151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1181040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Helper to compare two MIME types, where one may be a pattern.
1191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param concreteType A fully-specified MIME type.
1203390018c6b45acffa6edf97a4174ca49f1e8c76dJohn Spurlock     * @param desiredType A desired MIME type that may be a pattern such as *&#47;*.
1211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if the two MIME types match.
1221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static boolean compareMimeTypes(String concreteType, String desiredType) {
1241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int typeLength = desiredType.length();
1251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (typeLength == 3 && desiredType.equals("*/*")) {
1261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return true;
1271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int slashpos = desiredType.indexOf('/');
1301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (slashpos > 0) {
1311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (typeLength == slashpos+2 && desiredType.charAt(slashpos+1) == '*') {
1321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (desiredType.regionMatches(0, concreteType, 0, slashpos+1)) {
1331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    return true;
1341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            } else if (desiredType.equals(concreteType)) {
1361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the label for this clip.
1451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public CharSequence getLabel() {
1471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mLabel;
1481040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Check whether the clip description contains the given MIME type.
1521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if one of the MIME types in the clip description
1551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matches the desired MIME type, else false.
1561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public boolean hasMimeType(String mimeType) {
1581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Filter the clip description MIME types by the given MIME type.  Returns
1681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * all MIME types in the clip that match the given MIME type.
1691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns an array of all matching MIME types.  If there are no
1721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matching MIME types, null is returned.
1731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String[] filterMimeTypes(String mimeType) {
1751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        ArrayList<String> array = null;
1761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (array == null) {
1791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    array = new ArrayList<String>();
1801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                array.add(mMimeTypes[i]);
1821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (array == null) {
1851040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return null;
1861040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1871040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        String[] rawArray = new String[array.size()];
1881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        array.toArray(rawArray);
1891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return rawArray;
1901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the number of MIME types the clip is available in.
1941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int getMimeTypeCount() {
1961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes.length;
1971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
2001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return one of the possible clip MIME types.
2011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
2021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String getMimeType(int index) {
2031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes[index];
2041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
206ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
207ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Retrieve extended data from the clip description.
208ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
209ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @return the bundle containing extended data previously set with
210ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * {@link #setExtras(PersistableBundle)}, or null if no extras have been set.
211ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
212ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @see #setExtras(PersistableBundle)
213ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
214ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public PersistableBundle getExtras() {
215ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        return mExtras;
216ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    }
217ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
218ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    /**
219ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * Add extended data to the clip description.
220ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     *
221ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     * @see #getExtras()
222ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev     */
223ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    public void setExtras(PersistableBundle extras) {
224ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        mExtras = new PersistableBundle(extras);
225ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev    }
226ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev
2271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /** @hide */
2281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void validate() {
2291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes == null) {
2301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("null mime types");
2311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes.length <= 0) {
2331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new IllegalArgumentException("must have at least 1 mime type");
2341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
2361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (mMimeTypes[i] == null) {
2371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                throw new NullPointerException("mime type at " + i + " is null");
2381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
2401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
24321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public String toString() {
24421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        StringBuilder b = new StringBuilder(128);
24521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
24621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append("ClipDescription { ");
24721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        toShortString(b);
24821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append(" }");
24921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
25021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return b.toString();
25121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
25221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
25321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    /** @hide */
25421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public boolean toShortString(StringBuilder b) {
255ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        boolean first = !toShortStringTypesOnly(b);
256ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        if (mLabel != null) {
25721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
25821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
25921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
26021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
261ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append('"');
262ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append(mLabel);
263ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append('"');
26421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
265ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        if (mExtras != null) {
266ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            if (!first) {
267ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev                b.append(' ');
268ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            }
269ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            first = false;
270ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev            b.append(mExtras.toString());
271ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        }
272ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        return !first;
273ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    }
274ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn
275ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    /** @hide */
276ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn    public boolean toShortStringTypesOnly(StringBuilder b) {
277ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        boolean first = true;
278ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
27921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
28021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
28121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
28221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
283ae498721001c6cdcdb6cce1b2f3ba5abbce36f8aDianne Hackborn            b.append(mMimeTypes[i]);
28421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
28521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return !first;
28621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
28721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
28821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    @Override
2891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int describeContents() {
2901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return 0;
2911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
2941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
2951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        TextUtils.writeToParcel(mLabel, dest, flags);
2961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        dest.writeStringArray(mMimeTypes);
297ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        dest.writePersistableBundle(mExtras);
2981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    ClipDescription(Parcel in) {
3011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
3021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = in.createStringArray();
303ddb4bdecfcb6fd84c0613f42c0fadb7fdd487839Vladislav Kaznacheev        mExtras = in.readPersistableBundle();
3041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
3051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final Parcelable.Creator<ClipDescription> CREATOR =
3071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        new Parcelable.Creator<ClipDescription>() {
3081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3091040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription createFromParcel(Parcel source) {
3101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription(source);
3111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
3121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
3131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription[] newArray(int size) {
3141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription[size];
3151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
3161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        };
3171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn}
318