PackageParser.java revision a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.XmlUtils;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
488d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
58a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
59a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
60a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = new PackageParser.NewPermissionInfo[] {
78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD,
79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                android.os.Build.VERSION_CODES.DONUT,
80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                0)
81a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSdkVersion;
86851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    private String mSdkCodename;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes) {
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes,
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                String[] _sepProcesses, int _processRes,int _enabledRes) {
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(_owner, _outError, _nameRes, _labelRes, _iconRes);
1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
151851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    public void setSdkVersion(int sdkVersion, String codename) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSdkVersion = sdkVersion;
153851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        mSdkCodename = codename;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gids[], int flags) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.configPreferences[i] = p.configPreferences.get(i);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.activities = new ActivityInfo[N];
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.activities[i] = generateActivityInfo(p.activities.get(i), flags);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.receivers = new ActivityInfo[N];
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.receivers[i] = generateActivityInfo(p.receivers.get(i), flags);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.services = new ServiceInfo[N];
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.services[i] = generateServiceInfo(p.services.get(i), flags);
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.providers = new ProviderInfo[N];
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.providers[i] = generateProviderInfo(p.providers.get(i), flags);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.mSignatures.length;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.signatures = new Signature[N];
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is = jarFile.getInputStream(je);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IS_SYSTEM = 0x0001;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_CHATTY = 0x0002;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_MUST_BE_APK = 0x0004;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IGNORE_PROCESSES = 0x0008;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Package parsePackage(File sourceFile, String destFileName,
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
332b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
333b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
334b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.sourceDir = destFileName;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.publicSourceDir = destFileName;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String parsePackageName(String packageFilePath, int flags) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = null;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = parsePackageName(parser, attrs, flags, errors);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName == null) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "parsePackageName error: " + errors[0]);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return packageName;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
6301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
6311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
6321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
6331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
643851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionName = sa.getNonResourceString(
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionName);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_sharedUserId);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.requestedPermissions.add(name);
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mSdkVersion > 0) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
754851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
755851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
757851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
758851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
759851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
760851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
761851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
762851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
764851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
765851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
766851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            minVers = val.data;
767851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
768851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
769851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
770851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
771851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
772851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
773851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
774851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
775851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
776851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
777851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
778851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
779851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
780851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
781851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int maxVers = sa.getInt(
782851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_maxSdkVersion,
783851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mSdkVersion);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
787851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
788851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (!targetCode.equals(mSdkCodename)) {
789851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            if (mSdkCodename != null) {
790851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
791851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " (current platform is " + mSdkCodename + ")";
792851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
793851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
794851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
795851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
796851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
797851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
798851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
799851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
800a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
801a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
802a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
803a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
804851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
805851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
806851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (minVers > mSdkVersion) {
807851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
808851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
809851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
810851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        return null;
811851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
812851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
813851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (maxVers < mSdkVersion) {
814851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        outError[0] = "Requires older sdk version #" + maxVers
815851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("instrumentation")) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("eat-comment")) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Just skip this tag
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (RIGID_PARSER) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <manifest>: "
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Bad element under <manifest>: "
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + parser.getName());
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
850a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
851a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
852a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
853a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
854a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
855a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
856a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
857a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg "
858a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        + pkg.packageName);
859a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
860a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
861851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
862851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.usesLibraries.size() > 0) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.usesLibraryFiles = new String[pkg.usesLibraries.size()];
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.usesLibraries.toArray(pkg.usesLibraryFiles);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8688d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        int size = pkg.supportsDensityList.size();
8698d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if (size > 0) {
8708d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            int densities[] = pkg.supportsDensities = new int[size];
8718d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            List<Integer> densityList = pkg.supportsDensityList;
8728d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            for (int i = 0; i < size; i++) {
8738d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                densities[i] = densityList.get(i);
8748d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            }
8758d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "package", outError);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_icon)) {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
11011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
11021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
11031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
11041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon);
11051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
11061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
11071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
11081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
11091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
11101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
11111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
11121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_name);
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String manageSpaceActivity = sa.getNonResourceString(
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity);
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1222ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1223ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1224e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1225ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1226ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1227ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_permission);
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.processName = buildProcessName(ai.packageName, null, sa.getNonResourceString(
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_process),
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.enabled = sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false);
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
13001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lname != null && !owner.usesLibraries.contains(lname)) {
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    owner.usesLibraries.add(lname);
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13338d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            } else if (tagName.equals("supports-density")) {
13348d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                sa = res.obtainAttributes(attrs,
13358d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                        com.android.internal.R.styleable.AndroidManifestSupportsDensity);
13368d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
13378d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                int density = sa.getInteger(
13388d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                        com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1);
13398d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
13408d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                sa.recycle();
13418d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
13428d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                if (density != -1 && !owner.supportsDensityList.contains(density)) {
13438d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                    owner.supportsDensityList.add(density);
13448d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                }
13458d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
13468d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                XmlUtils.skipCurrentTag(parser);
13478d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <application>: " + tagName);
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes) {
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(nameRes);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseComponentInfo(Package owner, int flags,
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentInfo outInfo, String[] outError, String tag, TypedArray sa,
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes, int processRes,
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int enabledRes) {
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, outInfo, outError, tag, sa,
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nameRes, labelRes, iconRes)) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (processRes != 0) {
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    owner.applicationInfo.processName, sa.getNonResourceString(processRes),
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.enabled = sa.getBoolean(enabledRes, true);
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return outError[0] == null;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean receiver) throws XmlPullParserException, IOException {
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
14221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
14231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
14241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
14251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
14261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
14271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
14281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
14291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
14301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
14321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
14331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
14341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
14361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_permission);
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity);
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Intent filter for activity " + intent
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " defines no actions");
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName());
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName());
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
15911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
15921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String targetActivity = sa.getNonResourceString(
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity);
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
16121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
16131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
16141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
16151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
16161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
16171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
16181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
16191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
16201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
16211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
16231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
16241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
16451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
16461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
16471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
16481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
16491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
16501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
16511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
16521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
16531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
16541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
16551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
16571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission);
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Intent filter for activity alias " + intent
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " defines no actions");
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName());
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
17331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
17351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
17361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
17371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
17391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
17401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
17411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
17421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
17441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
17451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
17471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cpname = sa.getNonResourceString(
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_authorities);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String permission = sa.getNonResourceString(
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_permission);
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_readPermission);
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_writePermission);
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path);
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix);
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern);
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
18961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
18971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
18981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
18991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
19001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
19021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
19031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
19041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
19051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
19071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
19081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_permission);
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_name);
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putString(name, cs != null ? cs.toString() : null);
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types");
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_mimeType);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_scheme);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String host = sa.getNonResourceString(
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_host);
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String port = sa.getNonResourceString(
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_port);
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_path);
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix);
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPattern);
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Unknown element under <intent-filter>: " + parser.getName());
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final String packageName;
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> usesLibraries = new ArrayList<String>();
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22298d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>();
22308d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        public int[] supportsDensities = null;
22318d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
22781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
22791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ComponentName component;
22801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final String componentShortName;
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
22851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
22861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = null;
22871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = null;
22881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
22891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
22901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
22911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
22921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
22931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            String name = args.sa.getNonResourceString(args.nameRes);
22941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
22951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
22961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
22971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
22981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
22991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
23021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
23031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
23041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
23051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
23061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
23071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
23081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = new ComponentName(owner.applicationInfo.packageName,
23111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    outInfo.name);
23121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = component.flattenToShortString();
23131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
23151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
23161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
23171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
23181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
23271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes),
23371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
23381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
23441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
23451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = clone.component;
23461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            metaData = clone.metaData;
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24028d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0
24038d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            && p.supportsDensities != null) {
24048d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            return true;
24058d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24238d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
24248d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            ai.supportsDensities = p.supportsDensities;
24258d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
24521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
24551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
24561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
24571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
24811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
24841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
24851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
24861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
25131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
25141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
25151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
25511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
25541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
25551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2611