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 */*. 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