PackageParser.java revision bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94
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     */
7745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
7845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
795a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
8245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
83a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSdkVersion;
88851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    private String mSdkCodename;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    private static boolean sCompatibilityModeEnabled = true;
9669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes) {
1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes,
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                String[] _sepProcesses, int _processRes,int _enabledRes) {
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(_owner, _outError, _nameRes, _labelRes, _iconRes);
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
155851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    public void setSdkVersion(int sdkVersion, String codename) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSdkVersion = sdkVersion;
157851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        mSdkCodename = codename;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gids[], int flags) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
18749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.configPreferences.toArray(pi.configPreferences);
18849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
18949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            N = p.reqFeatures != null ? p.reqFeatures.size() : 0;
19049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            if (N > 0) {
19149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pi.reqFeatures = new FeatureInfo[N];
19249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.reqFeatures.toArray(pi.reqFeatures);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1987eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1997eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[N];
2007eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2017eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2027eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2037eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.activities.get(i).info.enabled) num++;
2047eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2057eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[num];
2067eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.activities[i] = generateActivityInfo(p.activities.get(i), flags);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2197eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[N];
2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2227eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2237eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2247eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.receivers.get(i).info.enabled) num++;
2257eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2267eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[num];
2277eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.receivers[i] = generateActivityInfo(p.receivers.get(i), flags);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[N];
2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2457eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.services.get(i).info.enabled) num++;
2467eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2477eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[num];
2487eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.services[i] = generateServiceInfo(p.services.get(i), flags);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[N];
2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2667eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.providers.get(i).info.enabled) num++;
2677eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2687eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[num];
2697eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.providers[i] = generateProviderInfo(p.providers.get(i), flags);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
306c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu            if (p.mSignatures != null) {
307c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu                int N = p.mSignatures.length;
308c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu                if (N > 0) {
309c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu                    pi.signatures = new Signature[N];
310c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu                    System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
311c748541ca0caffbe33c1d4690773d89c06bb3253Suchi Amalapurapu                }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is = jarFile.getInputStream(je);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IS_SYSTEM = 0x0001;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_CHATTY = 0x0002;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_MUST_BE_APK = 0x0004;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IGNORE_PROCESSES = 0x0008;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Package parsePackage(File sourceFile, String destFileName,
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
373b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
374b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
375b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.sourceDir = destFileName;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.publicSourceDir = destFileName;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String parsePackageName(String packageFilePath, int flags) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = null;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = parsePackageName(parser, attrs, flags, errors);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName == null) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "parsePackageName error: " + errors[0]);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return packageName;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
6711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
6721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
6731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
6741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
684851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionName = sa.getNonResourceString(
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionName);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_sharedUserId);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
710723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        // Resource boolean are -1, so 1 means we don't know the value.
711723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsSmallScreens = 1;
712723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsNormalScreens = 1;
713723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsLargeScreens = 1;
714c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        int resizeable = 1;
71511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        int anyDensity = 1;
716723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
764854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    pkg.requestedPermissions.add(name.intern());
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
797d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu            } else if (tagName.equals("uses-feature")) {
79849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                FeatureInfo fi = new FeatureInfo();
799d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa = res.obtainAttributes(attrs,
800d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                        com.android.internal.R.styleable.AndroidManifestUsesFeature);
80149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                fi.name = sa.getNonResourceString(
80249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_name);
80349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
80449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.reqGlEsVersion = sa.getInt(
80549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion,
80649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            FeatureInfo.GL_ES_VERSION_UNDEFINED);
80749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
80849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (sa.getBoolean(
80949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_required,
81049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true)) {
81149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.flags |= FeatureInfo.FLAG_REQUIRED;
81249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
813d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa.recycle();
81449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (pkg.reqFeatures == null) {
81549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.reqFeatures = new ArrayList<FeatureInfo>();
81649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
81749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pkg.reqFeatures.add(fi);
81849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
81949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
82049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    ConfigurationInfo cPref = new ConfigurationInfo();
82149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    cPref.reqGlEsVersion = fi.reqGlEsVersion;
82249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.configPreferences.add(cPref);
82349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
824d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
825d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                XmlUtils.skipCurrentTag(parser);
826d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
827851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mSdkVersion > 0) {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
832851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
833851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
834851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
835851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
836851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
837851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
838851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
839851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
840851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
841851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
842851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
843851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
8445c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            targetVers = minVers = val.data;
845851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
846851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
847851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
848851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
849851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
850851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
851851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
852851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
853851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
854851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
855851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
856851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
857851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
858851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
859851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int maxVers = sa.getInt(
860851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_maxSdkVersion,
861851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mSdkVersion);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8655c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    if (minCode != null) {
8665c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        if (!minCode.equals(mSdkCodename)) {
8675c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            if (mSdkCodename != null) {
8685c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
8695c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " (current platform is " + mSdkCodename + ")";
8705c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            } else {
8715c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
8725c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " but this is a release platform.";
8735c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            }
8745c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
8755c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            return null;
8765c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        }
8775c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    } else if (minVers > mSdkVersion) {
8785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
8795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
8805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
8815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        return null;
8825c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    }
8835c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
884851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
885851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (!targetCode.equals(mSdkCodename)) {
886851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            if (mSdkCodename != null) {
887851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
888851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " (current platform is " + mSdkCodename + ")";
889851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
890851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
891851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
892851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
893851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
894851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
895851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
896851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
897a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
898a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
899a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
900a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
901851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
902851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
903851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (maxVers < mSdkVersion) {
904851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        outError[0] = "Requires older sdk version #" + maxVers
905851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
913723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else if (tagName.equals("supports-screens")) {
914723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa = res.obtainAttributes(attrs,
915723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens);
916723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
917723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is a trick to get a boolean and still able to detect
918723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // if a value was actually set.
919723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsSmallScreens = sa.getInteger(
920723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens,
921723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsSmallScreens);
922723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsNormalScreens = sa.getInteger(
923723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens,
924723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsNormalScreens);
925723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsLargeScreens = sa.getInteger(
926723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens,
927723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsLargeScreens);
928c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                resizeable = sa.getInteger(
929c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable,
930c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        supportsLargeScreens);
93111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                anyDensity = sa.getInteger(
93211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity,
93311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        anyDensity);
934723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
935723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa.recycle();
936723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
9379189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
938854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
939854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("protected-broadcast")) {
940854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa = res.obtainAttributes(attrs,
941854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
942854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
943854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                String name = sa.getNonResourceString(
944854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
945854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
946854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa.recycle();
947854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
948854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
949854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (pkg.protectedBroadcasts == null) {
950854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts = new ArrayList<String>();
951854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
952854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (!pkg.protectedBroadcasts.contains(name)) {
953854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts.add(name.intern());
954854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
955854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
956854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
957854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
958854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
959854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("instrumentation")) {
960854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
961854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    return null;
962854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
963854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
964854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("eat-comment")) {
965854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                // Just skip this tag
966854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
967854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                continue;
968854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
969854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (RIGID_PARSER) {
970854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                outError[0] = "Bad element under <manifest>: "
971854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    + parser.getName();
972854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
973854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                return null;
974854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
976bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                Log.w(TAG, "Unknown element under <manifest>: " + parser.getName()
977bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + " at " + mArchiveSourcePath + " "
978bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + parser.getPositionDescription());
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
990a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        StringBuilder implicitPerms = null;
991a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
992a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
993a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
994a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
995a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
996a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
997a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
998a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (implicitPerms == null) {
999a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms = new StringBuilder(128);
1000a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(pkg.packageName);
1001a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(": compat added ");
1002a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                } else {
1003a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(' ');
1004a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
1005a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                implicitPerms.append(npi.name);
1006a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
1007a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1008851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
1009a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        if (implicitPerms != null) {
1010a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            Log.i(TAG, implicitPerms.toString());
1011a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        }
1012851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1013723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
1014723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
101511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1016723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
1017723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1018723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsNormalScreens != 0) {
1019723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS;
1020723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1021723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsLargeScreens < 0 || (supportsLargeScreens > 0
1022723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
102311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1024723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
1025723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1026c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (resizeable < 0 || (resizeable > 0
1027c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
102811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1029c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS;
1030c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
103111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        if (anyDensity < 0 || (anyDensity > 0
103211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
103311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
103411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
10351ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        }
10361ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "package", outError);
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_icon)) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) {
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
12621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
12631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
12641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
12651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon);
12661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
12671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
12681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
12691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
12701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
12711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
12721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
12731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_name);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String manageSpaceActivity = sa.getNonResourceString(
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity);
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1338181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1339181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1340181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1341181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
13425e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
13435e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate            // backupAgent, killAfterRestore, and restoreNeedsApplication are only relevant
13445e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate            // if backup is possible for the given application.
1345181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            String backupAgent = sa.getNonResourceString(
1346181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent);
1347181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1348181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1349a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (false) {
1350a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
1351a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " from " + pkgName + "+" + backupAgent);
1352a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
13535e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
13545e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
13555e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
13565e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        true)) {
13575e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
13585e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
13595e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
13605e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_restoreNeedsApplication,
13615e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        false)) {
13625e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION;
13635e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
1364181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1365181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
1366181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1412ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1413ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1414e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1415ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1416ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1417ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_permission);
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.processName = buildProcessName(ai.packageName, null, sa.getNonResourceString(
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_process),
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.enabled = sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
14901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
151449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                boolean req = sa.getBoolean(
151549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_required,
151649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (lname != null) {
152149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    if (req) {
152249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesLibraries == null) {
152349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries = new ArrayList<String>();
152449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
152549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesLibraries.contains(lname)) {
152649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries.add(lname.intern());
152749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
152849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    } else {
152949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesOptionalLibraries == null) {
153049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries = new ArrayList<String>();
153149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
153249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesOptionalLibraries.contains(lname)) {
153349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries.add(lname.intern());
153449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
153549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    }
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1542a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <application>: " + tagName
1543a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1544a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(nameRes);
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean receiver) throws XmlPullParserException, IOException {
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
15961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
15971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
15981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
15991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
16001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
16011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
16021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
16031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
16041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
16061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
16071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
16081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
16101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_permission);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity);
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1688ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        if (sa.getBoolean(
1689ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs,
1690ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                false)) {
1691ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
1692ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
1693ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
1733bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
1734bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
1735bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
1748a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()
1749a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1750a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1752a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName()
1753a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1754a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
17761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
17771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String targetActivity = sa.getNonResourceString(
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity);
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
17971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
17981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
17991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
18001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
18011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
18021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
18031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
18041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
18051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
18061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
18071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
18081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
18091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
18291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
18301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
18311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
18321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
18331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
18341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
18351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
18361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
18371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
18381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
18391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
18401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
18411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
18421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
1882bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
1883bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
1884bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1895a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
1896a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1897a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
19201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
19211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
19221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
19231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
19241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
19261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
19271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
19281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
19291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
19321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
19341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cpname = sa.getNonResourceString(
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_authorities);
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String permission = sa.getNonResourceString(
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_permission);
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_readPermission);
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_writePermission);
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path);
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern);
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
20582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
20592af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2060a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <path-permission>: "
2061a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2062a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
20632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
20642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
20652af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
20662af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
20672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
20682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
20692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
20702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn            } else if (parser.getName().equals("path-permission")) {
20722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                TypedArray sa = res.obtainAttributes(attrs,
20732af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission);
20742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                PathPermission pa = null;
20762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                String permission = sa.getNonResourceString(
20782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission);
20792af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                String readPermission = sa.getNonResourceString(
20802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission);
20812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission == null) {
20822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = permission;
20832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
20842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                String writePermission = sa.getNonResourceString(
20852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission);
20862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission == null) {
20872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = permission;
20882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
20892af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
20902af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                boolean havePerm = false;
20912af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission != null) {
20922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = readPermission.intern();
20932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
20942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
20952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission != null) {
20962af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = readPermission.intern();
20972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
20982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
20992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (!havePerm) {
21012af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2102a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No readPermission or writePermssion for <path-permission>: "
2103a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2104a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
21052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
21062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
21072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
21082af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No readPermission or writePermssion for <path-permission>";
21092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
21102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
21112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                String path = sa.getNonResourceString(
21132af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_path);
21142af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
21152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
21162af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
21172af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
21182af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                path = sa.getNonResourceString(
21202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix);
21212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
21222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
21232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
21242af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
21252af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                path = sa.getNonResourceString(
21272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern);
21282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
21292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
21302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
21312af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
21322af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                sa.recycle();
21342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (pa != null) {
21362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (outInfo.info.pathPermissions == null) {
21372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = new PathPermission[1];
21382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions[0] = pa;
21392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    } else {
21402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        final int N = outInfo.info.pathPermissions.length;
21412af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        PathPermission[] newp = new PathPermission[N+1];
21422af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
21432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        newp[N] = pa;
21442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = newp;
21452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
21462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
21472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2148a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
2149a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2150a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
21512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
21522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
21532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
21542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
21552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
2162a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2163a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
21821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
21831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
21841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
21851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
21861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
21871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
21881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
21891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
21901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
21911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
21931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
21941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
21961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_permission);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
2242a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2243a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
2281a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2282a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_name);
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2314854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        name = name.intern();
2315854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
2328854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    data.putString(name, cs != null ? cs.toString().intern() : null);
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
2338a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
2339a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2340a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
2374a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    + mArchiveSourcePath + " "
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_mimeType);
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_scheme);
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String host = sa.getNonResourceString(
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_host);
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String port = sa.getNonResourceString(
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_port);
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_path);
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix);
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPattern);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
2472a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                Log.w(TAG, "Unknown element under <intent-filter>: "
2473a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getName() + " at " + mArchiveSourcePath + " "
2474a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getPositionDescription());
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final String packageName;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2512854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        public ArrayList<String> protectedBroadcasts;
2513854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
251449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesLibraries = null;
251549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesOptionalLibraries = null;
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25435c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager service to keep track of which apps
25445c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // have been installed with forward locking.
25455c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mForwardLocked;
25465c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
25475c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by the package manager to keep track of the path to the
25485c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // file an app came from.
25495c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public String mScanPath;
25505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
25515c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager to keep track of where it has done dexopt.
25525c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mDidDexOpt;
25535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
256349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        /*
256449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         *  Applications requested features
256549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         */
256649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<FeatureInfo> reqFeatures = null;
256749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
25831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
25841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ComponentName component;
25851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final String componentShortName;
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
25901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
25911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = null;
25921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = null;
25931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
25941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
25961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
25971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
25981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            String name = args.sa.getNonResourceString(args.nameRes);
25991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
26001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
26011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
26021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
26031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
26041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
26071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
26081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
26091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
26101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
26111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
26121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
26131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = new ComponentName(owner.applicationInfo.packageName,
26161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    outInfo.name);
26171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = component.flattenToShortString();
26181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
26201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
26211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
26221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
26231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
26261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
26271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
26281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
26311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
26321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
26341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
26351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
26361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
26371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
26391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
26401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
26411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes),
26421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
26431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
26441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
26491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
26501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = clone.component;
26511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            metaData = clone.metaData;
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
271369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // CompatibilityMode is global state. It's safe to modify the instance
271469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // of the package.
271569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            if (!sCompatibilityModeEnabled) {
271669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima                p.applicationInfo.disableCompatibilityMode();
271769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            }
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
272969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        if (!sCompatibilityModeEnabled) {
273069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            ai.disableCompatibilityMode();
273169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        }
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
27581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
27611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
27621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
27631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
27871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
27901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
27911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
27921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
28191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
28201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
28211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
28571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
28601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
28611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
291669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
291769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    /**
291869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     * @hide
291969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     */
292069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
292169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        sCompatibilityModeEnabled = compatibilityModeEnabled;
292269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2924