19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 216d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 226d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackbornimport java.io.PrintWriter; 236b61d41f72d4613384a78e792ab0e58f038cda65Joe Onoratoimport java.lang.Comparable; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Identifier for a specific application component 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ({@link android.app.Activity}, {@link android.app.Service}, 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.BroadcastReceiver}, or 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.ContentProvider}) that is available. Two 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pieces of information, encapsulated here, are required to identify 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a component: the package (a String) it exists in, and the class (a String) 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * name inside of that package. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35edc649aabc795bb31ff08c94836cd7268a70c73aJoe Onoratopublic final class ComponentName implements Parcelable, Cloneable, Comparable<ComponentName> { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String mPackage; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String mClass; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new component identifier. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pkg The name of the package that the component exists in. Can 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not be null. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cls The name of the class inside of <var>pkg</var> that 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implements the component. Can not be null. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName(String pkg, String cls) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) throw new NullPointerException("package name is null"); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls == null) throw new NullPointerException("class name is null"); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = pkg; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = cls; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new component identifier from a Context and class name. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pkg A Context for the package implementing the component, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from which the actual package name will be retrieved. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cls The name of the class inside of <var>pkg</var> that 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implements the component. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName(Context pkg, String cls) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls == null) throw new NullPointerException("class name is null"); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = pkg.getPackageName(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = cls; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new component identifier from a Context and Class object. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pkg A Context for the package implementing the component, from 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which the actual package name will be retrieved. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cls The Class object of the desired component, from which the 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual class name will be retrieved. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName(Context pkg, Class<?> cls) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = pkg.getPackageName(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = cls.getName(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81edc649aabc795bb31ff08c94836cd7268a70c73aJoe Onorato public ComponentName clone() { 82edc649aabc795bb31ff08c94836cd7268a70c73aJoe Onorato return new ComponentName(mPackage, mClass); 83edc649aabc795bb31ff08c94836cd7268a70c73aJoe Onorato } 84edc649aabc795bb31ff08c94836cd7268a70c73aJoe Onorato 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the package name of this component. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackageName() { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name of this component. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getClassName() { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClass; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the class name, either fully qualified or in a shortened form 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (with a leading '.') if it is a suffix of the package. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getShortClassName() { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClass.startsWith(mPackage)) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int PN = mPackage.length(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int CN = mClass.length(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (CN > PN && mClass.charAt(PN) == '.') { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClass.substring(PN, CN); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClass; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1146d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn private static void appendShortClassName(StringBuilder sb, String packageName, 1156d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn String className) { 1166d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (className.startsWith(packageName)) { 1176d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int PN = packageName.length(); 1186d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int CN = className.length(); 1196d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (CN > PN && className.charAt(PN) == '.') { 1206d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn sb.append(className, PN, CN); 1216d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn return; 1226d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1236d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1246d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn sb.append(className); 1256d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1266d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1276d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn private static void printShortClassName(PrintWriter pw, String packageName, 1286d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn String className) { 1296d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (className.startsWith(packageName)) { 1306d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int PN = packageName.length(); 1316d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn int CN = className.length(); 1326d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn if (CN > PN && className.charAt(PN) == '.') { 1336d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn pw.write(className, PN, CN-PN); 1346d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn return; 1356d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1366d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1376d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn pw.print(className); 1386d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1396d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a String that unambiguously describes both the package and 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class names contained in the ComponentName. You can later recover 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the ComponentName from this string through 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #unflattenFromString(String)}. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new String holding the package and class names. This 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is represented as the package name, concatenated with a '/' and then the 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class name. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #unflattenFromString(String) 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String flattenToString() { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage + "/" + mClass; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15721f1bd17b2dfe361acbb28453b3f3b1a110932faDianne Hackborn * The same as {@link #flattenToString()}, but abbreviates the class 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * name if it is a suffix of the package. The result can still be used 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with {@link #unflattenFromString(String)}. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new String holding the package and class names. This 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is represented as the package name, concatenated with a '/' and then the 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class name. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #unflattenFromString(String) 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String flattenToShortString() { 1686d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn StringBuilder sb = new StringBuilder(mPackage.length() + mClass.length()); 1696d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn appendShortString(sb, mPackage, mClass); 1706d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn return sb.toString(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1726d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1736d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn /** @hide */ 1746d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn public void appendShortString(StringBuilder sb) { 1756d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn appendShortString(sb, mPackage, mClass); 1766d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1776d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1786d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn /** @hide */ 1796d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn public static void appendShortString(StringBuilder sb, String packageName, String className) { 1806d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn sb.append(packageName).append('/'); 1816d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn appendShortClassName(sb, packageName, className); 1826d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1836d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1846d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn /** @hide */ 1856d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn public static void printShortString(PrintWriter pw, String packageName, String className) { 1866d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn pw.print(packageName); 1876d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn pw.print('/'); 1886d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn printShortClassName(pw, packageName, className); 1896d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn } 1906d8dfbd8149942f25f2b9643a12f1fb38f3be834Dianne Hackborn 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Recover a ComponentName from a String that was previously created with 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #flattenToString()}. It splits the string at the first '/', 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * taking the part before as the package name and the part after as the 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class name. As a special convenience (to use, for example, when 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parsing component names on the command line), if the '/' is immediately 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * followed by a '.' then the final class name will be the concatenation 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the package name with the string following the '/'. Thus 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "com.foo/.Blah" becomes package="com.foo" class="com.foo.Blah". 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param str The String that was returned by flattenToString(). 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new ComponentName containing the package and class 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * names that were encoded in <var>str</var> 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #flattenToString() 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ComponentName unflattenFromString(String str) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sep = str.indexOf('/'); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sep < 0 || (sep+1) >= str.length()) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = str.substring(0, sep); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = str.substring(sep+1); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.length() > 0 && cls.charAt(0) == '.') { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cls = pkg + cls; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName(pkg, cls); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return string representation of this class without the class's name 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a prefix. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toShortString() { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "{" + mPackage + "/" + mClass + "}"; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ComponentInfo{" + mPackage + "/" + mClass + "}"; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object obj) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj != null) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName other = (ComponentName)obj; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note: no null checks, because mPackage and mClass can 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // never be null. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage.equals(other.mPackage) 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mClass.equals(other.mClass); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassCastException e) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int hashCode() { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage.hashCode() + mClass.hashCode(); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2526b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato 2536b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato public int compareTo(ComponentName that) { 2546b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato int v; 2556b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato v = this.mPackage.compareTo(that.mPackage); 2566b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato if (v != 0) { 2576b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato return v; 2586b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato } 2596b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato return this.mClass.compareTo(that.mClass); 2606b61d41f72d4613384a78e792ab0e58f038cda65Joe Onorato } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(mPackage); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(mClass); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a ComponentName to a Parcel, handling null pointers. Must be 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read with {@link #readFromParcel(Parcel)}. 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c The ComponentName to be written. 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out The Parcel in which the ComponentName will be placed. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readFromParcel(Parcel) 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeToParcel(ComponentName c, Parcel out) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != null) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.writeToParcel(out, 0); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(null); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a ComponentName from a Parcel that was previously written 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with {@link #writeToParcel(ComponentName, Parcel)}, returning either 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a null or new object as appropriate. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in The Parcel from which to read the ComponentName 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a new ComponentName matching the previously written 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object, or null if a null had been written. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeToParcel(ComponentName, Parcel) 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ComponentName readFromParcel(Parcel in) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = in.readString(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg != null ? new ComponentName(pkg, in) : null; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<ComponentName> CREATOR 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<ComponentName>() { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName createFromParcel(Parcel in) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName(in); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName[] newArray(int size) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentName[size]; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instantiate a new ComponentName from the data in a Parcel that was 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written with {@link #writeToParcel(Parcel, int)}. Note that you 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must not use this with data written by 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeToParcel(ComponentName, Parcel)} since it is not possible 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to handle a null ComponentObject here. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in The Parcel containing the previously written ComponentName, 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * positioned at the location in the buffer where it was written. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentName(Parcel in) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = in.readString(); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPackage == null) throw new NullPointerException( 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "package name is null"); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = in.readString(); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClass == null) throw new NullPointerException( 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "class name is null"); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ComponentName(String pkg, Parcel in) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = pkg; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = in.readString(); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 339