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;
211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport android.text.TextUtils;
221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornimport java.util.ArrayList;
241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn/**
26f6d952bbc85706031e1ad29ec389c1e02cfff433Dianne Hackborn * Meta-data describing the contents of a {@link ClipData}.  Provides enough
271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * information to know if you can handle the ClipData, but not the data
281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn * itself.
293aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez *
303aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference">
313aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3>
323aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about using the clipboard framework, read the
333aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/clipboard/copy-paste.html">Copy and Paste</a>
343aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * developer guide.</p>
353aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div>
361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn */
371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornpublic class ClipDescription implements Parcelable {
381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding plain text.
401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
44acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     * The MIME type for a clip holding HTML text.
45acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn     */
46acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    public static final String MIMETYPE_TEXT_HTML = "text/html";
47acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn
48acb69bb909d098cea284df47d794c17171d84c91Dianne Hackborn    /**
491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding one or more URIs.  This should be
501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * used for URIs that are meaningful to a user (such as an http: URI).
511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * It should <em>not</em> be used for a content: URI that references some
521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * other piece of data; in that case the MIME type should be the type
531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * of the referenced data.
541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding an Intent.
591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final CharSequence mLabel;
631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final String[] mMimeTypes;
641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a new clip.
671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param label Label to show to the user describing this clip.
691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeTypes An array of MIME types this data is available as.
701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(CharSequence label, String[] mimeTypes) {
721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mimeTypes == null) {
731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("mimeTypes is null");
741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = label;
761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = mimeTypes;
771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a copy of a ClipDescription.
811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(ClipDescription o) {
831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = o.mLabel;
841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = o.mMimeTypes;
851040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
861040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
871040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Helper to compare two MIME types, where one may be a pattern.
891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param concreteType A fully-specified MIME type.
903390018c6b45acffa6edf97a4174ca49f1e8c76dJohn Spurlock     * @param desiredType A desired MIME type that may be a pattern such as *&#47;*.
911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if the two MIME types match.
921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static boolean compareMimeTypes(String concreteType, String desiredType) {
941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int typeLength = desiredType.length();
951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (typeLength == 3 && desiredType.equals("*/*")) {
961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return true;
971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int slashpos = desiredType.indexOf('/');
1001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (slashpos > 0) {
1011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (typeLength == slashpos+2 && desiredType.charAt(slashpos+1) == '*') {
1021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (desiredType.regionMatches(0, concreteType, 0, slashpos+1)) {
1031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    return true;
1041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            } else if (desiredType.equals(concreteType)) {
1061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1091040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the label for this clip.
1151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public CharSequence getLabel() {
1171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mLabel;
1181040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1201040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Check whether the clip description contains the given MIME type.
1221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if one of the MIME types in the clip description
1251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matches the desired MIME type, else false.
1261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public boolean hasMimeType(String mimeType) {
1281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Filter the clip description MIME types by the given MIME type.  Returns
1381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * all MIME types in the clip that match the given MIME type.
1391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns an array of all matching MIME types.  If there are no
1421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matching MIME types, null is returned.
1431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String[] filterMimeTypes(String mimeType) {
1451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        ArrayList<String> array = null;
1461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1481040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (array == null) {
1491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    array = new ArrayList<String>();
1501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                array.add(mMimeTypes[i]);
1521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (array == null) {
1551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return null;
1561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        String[] rawArray = new String[array.size()];
1581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        array.toArray(rawArray);
1591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return rawArray;
1601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the number of MIME types the clip is available in.
1641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int getMimeTypeCount() {
1661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes.length;
1671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return one of the possible clip MIME types.
1711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String getMimeType(int index) {
1731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes[index];
1741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /** @hide */
1771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void validate() {
1781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes == null) {
1791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("null mime types");
1801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes.length <= 0) {
1821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new IllegalArgumentException("must have at least 1 mime type");
1831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1851040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (mMimeTypes[i] == null) {
1861040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                throw new NullPointerException("mime type at " + i + " is null");
1871040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
19221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public String toString() {
19321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        StringBuilder b = new StringBuilder(128);
19421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
19521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append("ClipDescription { ");
19621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        toShortString(b);
19721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        b.append(" }");
19821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
19921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return b.toString();
20021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
20121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
20221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    /** @hide */
20321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    public boolean toShortString(StringBuilder b) {
20421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        boolean first = true;
20521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
20621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
20721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
20821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
20921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
21021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            b.append(mMimeTypes[i]);
21121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
21221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        if (mLabel != null) {
21321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            if (!first) {
21421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn                b.append(' ');
21521c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            }
21621c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            first = false;
21721c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            b.append('"');
21821c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            b.append(mLabel);
21921c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn            b.append('"');
22021c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        }
22121c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn        return !first;
22221c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    }
22321c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn
22421c241e061de29a538008ca42df9c878184bcfb8Dianne Hackborn    @Override
2251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int describeContents() {
2261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return 0;
2271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
2301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
2311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        TextUtils.writeToParcel(mLabel, dest, flags);
2321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        dest.writeStringArray(mMimeTypes);
2331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    ClipDescription(Parcel in) {
2361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
2371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = in.createStringArray();
2381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
2391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final Parcelable.Creator<ClipDescription> CREATOR =
2411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        new Parcelable.Creator<ClipDescription>() {
2421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription createFromParcel(Parcel source) {
2441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription(source);
2451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription[] newArray(int size) {
2481040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription[size];
2491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        };
2511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn}
252