ClipDescription.java revision f6d952bbc85706031e1ad29ec389c1e02cfff433
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.
291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn */
301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackbornpublic class ClipDescription implements Parcelable {
311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding plain text.
331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_PLAIN = "text/plain";
351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding one or more URIs.  This should be
381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * used for URIs that are meaningful to a user (such as an http: URI).
391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * It should <em>not</em> be used for a content: URI that references some
401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * other piece of data; in that case the MIME type should be the type
411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * of the referenced data.
421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_URILIST = "text/uri-list";
441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * The MIME type for a clip holding an Intent.
471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
481040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final CharSequence mLabel;
511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    final String[] mMimeTypes;
521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a new clip.
551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param label Label to show to the user describing this clip.
571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeTypes An array of MIME types this data is available as.
581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(CharSequence label, String[] mimeTypes) {
601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mimeTypes == null) {
611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("mimeTypes is null");
621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = label;
641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = mimeTypes;
651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Create a copy of a ClipDescription.
691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public ClipDescription(ClipDescription o) {
711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = o.mLabel;
721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = o.mMimeTypes;
731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Helper to compare two MIME types, where one may be a pattern.
771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param concreteType A fully-specified MIME type.
781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param desiredType A desired MIME type that may be a pattern such as *\/*.
791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if the two MIME types match.
801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static boolean compareMimeTypes(String concreteType, String desiredType) {
821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int typeLength = desiredType.length();
831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (typeLength == 3 && desiredType.equals("*/*")) {
841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return true;
851040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
861040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
871040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        final int slashpos = desiredType.indexOf('/');
881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (slashpos > 0) {
891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (typeLength == slashpos+2 && desiredType.charAt(slashpos+1) == '*') {
901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (desiredType.regionMatches(0, concreteType, 0, slashpos+1)) {
911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    return true;
921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            } else if (desiredType.equals(concreteType)) {
941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the label for this clip.
1031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public CharSequence getLabel() {
1051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mLabel;
1061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1071040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1081040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1091040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Check whether the clip description contains the given MIME type.
1101040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1111040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1121040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns true if one of the MIME types in the clip description
1131040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matches the desired MIME type, else false.
1141040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1151040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public boolean hasMimeType(String mimeType) {
1161040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1171040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1181040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return true;
1191040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1201040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1211040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return false;
1221040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1231040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1241040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1251040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Filter the clip description MIME types by the given MIME type.  Returns
1261040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * all MIME types in the clip that match the given MIME type.
1271040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     *
1281040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @param mimeType The desired MIME type.  May be a pattern.
1291040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * @return Returns an array of all matching MIME types.  If there are no
1301040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * matching MIME types, null is returned.
1311040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1321040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String[] filterMimeTypes(String mimeType) {
1331040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        ArrayList<String> array = null;
1341040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1351040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (compareMimeTypes(mMimeTypes[i], mimeType)) {
1361040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                if (array == null) {
1371040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                    array = new ArrayList<String>();
1381040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                }
1391040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                array.add(mMimeTypes[i]);
1401040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1411040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1421040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (array == null) {
1431040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            return null;
1441040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1451040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        String[] rawArray = new String[array.size()];
1461040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        array.toArray(rawArray);
1471040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return rawArray;
1481040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1491040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1501040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1511040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return the number of MIME types the clip is available in.
1521040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1531040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int getMimeTypeCount() {
1541040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes.length;
1551040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1561040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1571040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /**
1581040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     * Return one of the possible clip MIME types.
1591040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn     */
1601040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public String getMimeType(int index) {
1611040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return mMimeTypes[index];
1621040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1631040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1641040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    /** @hide */
1651040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void validate() {
1661040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes == null) {
1671040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new NullPointerException("null mime types");
1681040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1691040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        if (mMimeTypes.length <= 0) {
1701040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            throw new IllegalArgumentException("must have at least 1 mime type");
1711040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1721040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        for (int i=0; i<mMimeTypes.length; i++) {
1731040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            if (mMimeTypes[i] == null) {
1741040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                throw new NullPointerException("mime type at " + i + " is null");
1751040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
1761040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        }
1771040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1781040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1791040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
1801040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public int describeContents() {
1811040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        return 0;
1821040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1831040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1841040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    @Override
1851040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public void writeToParcel(Parcel dest, int flags) {
1861040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        TextUtils.writeToParcel(mLabel, dest, flags);
1871040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        dest.writeStringArray(mMimeTypes);
1881040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1891040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1901040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    ClipDescription(Parcel in) {
1911040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
1921040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        mMimeTypes = in.createStringArray();
1931040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    }
1941040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1951040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn    public static final Parcelable.Creator<ClipDescription> CREATOR =
1961040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        new Parcelable.Creator<ClipDescription>() {
1971040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
1981040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription createFromParcel(Parcel source) {
1991040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription(source);
2001040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2011040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn
2021040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            public ClipDescription[] newArray(int size) {
2031040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn                return new ClipDescription[size];
2041040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn            }
2051040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn        };
2061040dc465cbf5ca8f834a87c949e476abefa3f76Dianne Hackborn}
207