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