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