PackageParser.java revision 78d688369a2240009d3bbe4126996a973b2e2fe2
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;
308d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapuimport android.os.Build;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher;
33aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapuimport android.provider.Settings;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
392269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
402269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Rootimport java.io.BufferedInputStream;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
8245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
835a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
8445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
8545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
8645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
87a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
918d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final int SDK_VERSION = Build.VERSION.SDK_INT;
928d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME)
938d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu            ? null : Build.VERSION.CODENAME;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static boolean sCompatibilityModeEnabled = true;
10190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
10269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
10981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        final int logoRes;
1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
11581cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes) {
1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
12181cd2e90ccdda498234384c8207afe2213714e60Adam Powell            logoRes = _logoRes;
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        final int descriptionRes;
1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
13381cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes,
1348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String[] _sepProcesses, int _processRes,
1358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                int _descriptionRes, int _enabledRes) {
13681cd2e90ccdda498234384c8207afe2213714e60Adam Powell            super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes);
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            descriptionRes = _descriptionRes;
1401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /* Light weight package info.
145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @hide
146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static class PackageLite {
148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String packageName;
149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public int installLocation;
150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String mScanPath;
151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public PackageLite(String packageName, int installLocation) {
152a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.packageName = packageName;
153a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.installLocation = installLocation;
154a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
155a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
156a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
19078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn            int gids[], int flags, long firstInstallTime, long lastUpdateTime) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
199117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pi.installLocation = p.installLocation;
20078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn        pi.firstInstallTime = firstInstallTime;
20178d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn        pi.lastUpdateTime = lastUpdateTime;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
20949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.configPreferences.toArray(pi.configPreferences);
21049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
21149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            N = p.reqFeatures != null ? p.reqFeatures.size() : 0;
21249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            if (N > 0) {
21349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pi.reqFeatures = new FeatureInfo[N];
21449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.reqFeatures.toArray(pi.reqFeatures);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[N];
2227eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2237eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2247eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2257eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.activities.get(i).info.enabled) num++;
2267eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2277eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[num];
2287eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
229d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
233d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[N];
2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2457eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2467eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.receivers.get(i).info.enabled) num++;
2477eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2487eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[num];
2497eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
250d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
254d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[N];
2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2667eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2677eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.services.get(i).info.enabled) num++;
2687eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2697eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[num];
2707eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
271d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
275d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.services[j++] = generateServiceInfo(p.services.get(i), flags);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[N];
2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2877eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2887eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.providers.get(i).info.enabled) num++;
2897eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2907eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[num];
2917eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
292d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
296d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
328d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
329d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           if (N > 0) {
330d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                pi.signatures = new Signature[N];
331d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
342d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Root            InputStream is = new BufferedInputStream(jarFile.getInputStream(je));
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
3516e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn        } catch (RuntimeException e) {
3526e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn            Log.w(TAG, "Exception reading " + je.getName() + " in "
3536e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn                    + jarFile.getName(), e);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
358af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IS_SYSTEM = 1<<0;
359af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_CHATTY = 1<<1;
360af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_MUST_BE_APK = 1<<2;
361af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IGNORE_PROCESSES = 1<<3;
362af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_FORWARD_LOCK = 1<<4;
363af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_ON_SDCARD = 1<<5;
364806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn    public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
370af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public Package parsePackage(File sourceFile, String destCodePath,
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
399b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
400b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
401b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
447af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        // Set code and resource paths
448af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mPath = destCodePath;
449af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mScanPath = mArchiveSourcePath;
450af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.sourceDir = destCodePath;
451af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.publicSourceDir = destRes;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
588a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /*
589a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * Utility method that retrieves just the package name and install
590a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * location from the apk location at the given file path.
591a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param packageFilePath file location of the apk
592a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param flags Special parse flags
593930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root     * @return PackageLite object with package information or null on failure.
594a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
595a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static PackageLite parsePackageLite(String packageFilePath, int flags) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
610a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        PackageLite packageLite = null;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
612a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            packageLite = parsePackageLite(parser, attrs, flags, errors);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
621a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (packageLite == null) {
622a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            Log.e(TAG, "parsePackageLite error: " + errors[0]);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
625a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return packageLite;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    private static PackageLite parsePackageLite(XmlPullParser parser,
690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            AttributeSet attrs, int flags, String[] outError)
691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            throws IOException, XmlPullParserException {
692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        int type;
694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        while ((type=parser.next()) != parser.START_TAG
695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                   && type != parser.END_DOCUMENT) {
696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            ;
697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (type != parser.START_TAG) {
700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No start tag found";
701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            TAG, "Root element name: '" + parser.getName() + "'");
705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (!parser.getName().equals("manifest")) {
706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No <manifest> tag";
707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String pkgName = attrs.getAttributeValue(null, "package");
710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (pkgName == null || pkgName.length() == 0) {
711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> does not specify package";
712a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
713a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String nameError = validateName(pkgName, true);
715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (nameError != null && !"android".equals(pkgName)) {
716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> specifies bad package name \""
717a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                + pkgName + "\": " + nameError;
718a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
72090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu        int installLocation = PARSE_DEFAULT_INSTALL_LOCATION;
721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        for (int i = 0; i < attrs.getAttributeCount(); i++) {
722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            String attr = attrs.getAttributeName(i);
723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            if (attr.equals("installLocation")) {
724a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                installLocation = attrs.getAttributeIntValue(i,
72590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                        PARSE_DEFAULT_INSTALL_LOCATION);
726a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                break;
727a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            }
728a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
729a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return new PackageLite(pkgName.intern(), installLocation);
730a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
731a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
7501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
7511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
7521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
7531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        pkg.mVersionName = sa.getNonConfigurationString(
769cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_versionName, 0);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
773cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
774cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0);
775cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        if (str != null && str.length() > 0) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
788aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu
789117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pkg.installLocation = sa.getInteger(
790117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu                com.android.internal.R.styleable.AndroidManifest_installLocation,
79190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                PARSE_DEFAULT_INSTALL_LOCATION);
79254e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        pkg.applicationInfo.installLocation = pkg.installLocation;
79354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn
794723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        // Resource boolean are -1, so 1 means we don't know the value.
795723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsSmallScreens = 1;
796723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsNormalScreens = 1;
797723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsLargeScreens = 1;
79814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        int supportsXLargeScreens = 1;
799c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        int resizeable = 1;
80011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        int anyDensity = 1;
801723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
843cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
844cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
851854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    pkg.requestedPermissions.add(name.intern());
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
884d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu            } else if (tagName.equals("uses-feature")) {
88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                FeatureInfo fi = new FeatureInfo();
886d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa = res.obtainAttributes(attrs,
887d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                        com.android.internal.R.styleable.AndroidManifestUsesFeature);
888cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
889cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                fi.name = sa.getNonResourceString(
89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_name);
89249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.reqGlEsVersion = sa.getInt(
89449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion,
89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            FeatureInfo.GL_ES_VERSION_UNDEFINED);
89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (sa.getBoolean(
89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_required,
89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true)) {
90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.flags |= FeatureInfo.FLAG_REQUIRED;
90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
902d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa.recycle();
90349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (pkg.reqFeatures == null) {
90449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.reqFeatures = new ArrayList<FeatureInfo>();
90549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
90649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pkg.reqFeatures.add(fi);
90749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
90849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
90949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    ConfigurationInfo cPref = new ConfigurationInfo();
91049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    cPref.reqGlEsVersion = fi.reqGlEsVersion;
91149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.configPreferences.add(cPref);
91249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
913d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
914d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                XmlUtils.skipCurrentTag(parser);
915d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
9178d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                if (SDK_VERSION > 0) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
923851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
925851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
9335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            targetVers = minVers = val.data;
934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
938851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
939851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
940851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
941851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
942851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
943851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
944851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
945851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
946851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
947851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    if (minCode != null) {
9518d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!minCode.equals(SDK_CODENAME)) {
9528d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            } else {
9565c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " but this is a release platform.";
9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            }
9595c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9605c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            return null;
9615c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        }
9628d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                    } else if (minVers > SDK_VERSION) {
9635c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
9648d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                + " (current version is #" + SDK_VERSION + ")";
9655c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9665c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        return null;
9675c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    }
9685c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
9708d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!targetCode.equals(SDK_CODENAME)) {
9718d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
972851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
9738d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
974851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
975851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
976851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
977851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
978851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
979851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
980851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
981851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
982a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
983a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
984a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
985a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
986851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else if (tagName.equals("supports-screens")) {
992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa = res.obtainAttributes(attrs,
993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens);
994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is a trick to get a boolean and still able to detect
996723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // if a value was actually set.
997723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsSmallScreens = sa.getInteger(
998723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens,
999723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsSmallScreens);
1000723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsNormalScreens = sa.getInteger(
1001723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens,
1002723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsNormalScreens);
1003723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsLargeScreens = sa.getInteger(
1004723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens,
1005723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsLargeScreens);
100614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                supportsXLargeScreens = sa.getInteger(
100714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens,
100814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        supportsXLargeScreens);
1009c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                resizeable = sa.getInteger(
1010c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable,
101114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        resizeable);
101211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                anyDensity = sa.getInteger(
101311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity,
101411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        anyDensity);
1015723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
1016723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa.recycle();
1017723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
10189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("protected-broadcast")) {
1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa = res.obtainAttributes(attrs,
1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1024cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1025cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                String name = sa.getNonResourceString(
1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa.recycle();
1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (pkg.protectedBroadcasts == null) {
1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts = new ArrayList<String>();
1034854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1035854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (!pkg.protectedBroadcasts.contains(name)) {
1036854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts.add(name.intern());
1037854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1038854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1039854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1040854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1041854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1042854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("instrumentation")) {
1043854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
1044854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    return null;
1045854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1046854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1047b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("original-package")) {
1048b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1049b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1050b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1051cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String orig =sa.getNonConfigurationString(
1052cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
10536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (!pkg.packageName.equals(orig)) {
1054c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    if (pkg.mOriginalPackages == null) {
1055c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mOriginalPackages = new ArrayList<String>();
1056c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mRealPackage = pkg.packageName;
1057c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    }
1058c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    pkg.mOriginalPackages.add(orig);
10596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                }
1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1061b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1062b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("adopt-permissions")) {
1066b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1069cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String name = sa.getNonConfigurationString(
1070cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
1071b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1072b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1073b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
10746dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (name != null) {
1075b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    if (pkg.mAdoptPermissions == null) {
1076b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        pkg.mAdoptPermissions = new ArrayList<String>();
1077b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    }
1078b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    pkg.mAdoptPermissions.add(name);
1079b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                }
1080b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1081b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1082b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1083854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("eat-comment")) {
1084854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                // Just skip this tag
1085854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1086854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                continue;
1087854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1088854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (RIGID_PARSER) {
1089854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                outError[0] = "Bad element under <manifest>: "
1090854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    + parser.getName();
1091854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
1092854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                return null;
1093854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1095bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                Log.w(TAG, "Unknown element under <manifest>: " + parser.getName()
1096bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + " at " + mArchiveSourcePath + " "
1097bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + parser.getPositionDescription());
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1108a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        StringBuilder implicitPerms = null;
1110a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
1111a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
1112a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
1113a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
1114a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
1115a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1116a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
1117a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (implicitPerms == null) {
1118a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms = new StringBuilder(128);
1119a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(pkg.packageName);
1120a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(": compat added ");
1121a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                } else {
1122a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(' ');
1123a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
1124a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                implicitPerms.append(npi.name);
1125a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
1126a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1127851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
1128a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        if (implicitPerms != null) {
1129a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            Log.i(TAG, implicitPerms.toString());
1130a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        }
1131851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1132723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
1133723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1135723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
1136723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1137723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsNormalScreens != 0) {
1138723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS;
1139723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1140723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsLargeScreens < 0 || (supportsLargeScreens > 0
1141723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
114211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1143723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
1144723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
114514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0
114614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
114714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        >= android.os.Build.VERSION_CODES.GINGERBREAD)) {
114814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS;
114914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        }
1150c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (resizeable < 0 || (resizeable > 0
1151c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
115211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1153c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS;
1154c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
115511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        if (anyDensity < 0 || (anyDensity > 0
115611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
115711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
115811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
11591ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        }
11601ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1233d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        return buildCompoundName(pkg, procSeq, "process", outError);
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
1259234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon, 0)) {
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
1294234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestPermission_icon, 0)) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
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
1300cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1301cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
1347234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon, 0)) {
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
13881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
13891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
13901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
1391234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon, 0);
13921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
13931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
13941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
13961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
13981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
13991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1406cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1407cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1448cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
1449cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_name, 0);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String manageSpaceActivity = sa.getNonConfigurationString(
1460cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1466181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1467181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1468181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1469181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
14705e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14713de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant
14723de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // if backup is possible for the given application.
1473cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String backupAgent = sa.getNonConfigurationString(
1474cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0);
1475181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1476181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1477a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (false) {
1478a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
1479a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " from " + pkgName + "+" + backupAgent);
1480a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
14815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
14845e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        true)) {
14855e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
14865e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
14875e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14883dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion,
14893dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        false)) {
14903dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
14913dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                }
1492181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1493181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
1494181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1516af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_FORWARD_LOCK) != 0) {
1517af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
1518af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1519af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
1520af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_ON_SDCARD) != 0) {
15216069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
1522af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1523af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
1531ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng                com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode,
153223085b781e145ed684e7270af1d5ced6800b8effBen Cheng                false)) {
153323085b781e145ed684e7270af1d5ced6800b8effBen Cheng            ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE;
153423085b781e145ed684e7270af1d5ced6800b8effBen Cheng        }
153523085b781e145ed684e7270af1d5ced6800b8effBen Cheng
153623085b781e145ed684e7270af1d5ced6800b8effBen Cheng        if (sa.getBoolean(
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1554ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1555ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1556e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1557ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1558ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1559ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
15601874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        if (sa.getBoolean(
15611874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt,
15621874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                false)) {
15631874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor            ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT;
15641874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        }
15651874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1567cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1568cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_permission, 0);
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1571d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1572d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonConfigurationString(
1573d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0);
1574d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        } else {
1575d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // Some older apps have been seen to use a resource reference
1576d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // here that on older builds was ignored (with a warning).  We
1577d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // need to continue to do this for them so they don't break.
1578d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonResourceString(
1579d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
1580d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
1585d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            CharSequence pname;
1586d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1587d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonConfigurationString(
1588d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process, 0);
1589d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            } else {
1590d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // Some older apps have been seen to use a resource reference
1591d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // here that on older builds was ignored (with a warning).  We
1592d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // need to continue to do this for them so they don't break.
1593d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonResourceString(
1594d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process);
1595d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            }
1596d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            ai.processName = buildProcessName(ai.packageName, null, pname,
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            ai.enabled = sa.getBoolean(
1600cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
1601860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
160202486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn            if (false) {
160302486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                if (sa.getBoolean(
160402486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_cantSaveState,
160502486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        false)) {
160654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    ai.flags |= ApplicationInfo.FLAG_CANT_SAVE_STATE;
160702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn
160802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    // A heavy-weight application can not be in a custom process.
160902486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    // We can do direct compare because we intern all strings.
161002486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    if (ai.processName != null && ai.processName != ai.packageName) {
161102486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        outError[0] = "cantSaveState applications can not use custom processes";
161202486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    }
1613860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                }
1614860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false);
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
16711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1693cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
169749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                boolean req = sa.getBoolean(
169849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_required,
169949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (lname != null) {
170449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    if (req) {
170549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesLibraries == null) {
170649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries = new ArrayList<String>();
170749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
170849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesLibraries.contains(lname)) {
170949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries.add(lname.intern());
171049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    } else {
171249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesOptionalLibraries == null) {
171349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries = new ArrayList<String>();
171449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesOptionalLibraries.contains(lname)) {
171649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries.add(lname.intern());
171749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    }
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1723cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn            } else if (tagName.equals("uses-package")) {
1724cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                // Dependencies for app installers; we don't currently try to
1725cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                // enforce this.
1726cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1727cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1730a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <application>: " + tagName
1731a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1732a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
174881cd2e90ccdda498234384c8207afe2213714e60Adam Powell            int nameRes, int labelRes, int iconRes, int logoRes) {
1749cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(nameRes, 0);
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
176681cd2e90ccdda498234384c8207afe2213714e60Adam Powell
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean receiver) throws XmlPullParserException, IOException {
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
17841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
17851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
17861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
1787234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon, 0,
17881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
17891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
17908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_description,
17911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
17921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
17931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
17951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
17961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
17971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
17991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1815cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1816cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_permission, 0);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1823cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1824cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0);
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1877ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        if (sa.getBoolean(
1878ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs,
1879ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                false)) {
1880ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
1881ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
1882ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
190354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
1904860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have receives in its main process
1905860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
1906860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (a.info.processName == owner.packageName) {
1907860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have receivers in main process";
1908860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
1909860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
1910860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
1930bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
1931bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
1932bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
1945a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()
1946a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1947a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1949a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName()
1950a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1951a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
19731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
19741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1978cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String targetActivity = sa.getNonConfigurationString(
1979cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0);
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
19941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
19951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
19961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
1997234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 0,
19981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
20008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_description,
20011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
20021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
20031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
20041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
20061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
20071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
20271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
20281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
20291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
20301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
203181cd2e90ccdda498234384c8207afe2213714e60Adam Powell        info.logo = target.info.logo;
20321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
20331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
20341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
20351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
20368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        if (info.descriptionRes == 0) {
20378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            info.descriptionRes = target.info.descriptionRes;
20388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
20391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
20401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
20411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
20421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
20441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
2057cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2058cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0);
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
2084bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
2085bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
2086bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2097a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
2098a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
2099a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
21221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
21231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
21241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
2125234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon, 0,
21261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
21271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
21288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_description,
21291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
21301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
21311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
21321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
21341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
21351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2145cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String cpname = sa.getNonConfigurationString(
2146cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0);
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2152cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String permission = sa.getNonConfigurationString(
2153cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_permission, 0);
2154cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2155cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0);
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2165cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2166cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0);
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
2192860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have providers in its main process
2193860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2194860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (p.info.processName == owner.packageName) {
2195860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have providers in main process";
2196860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2197860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2198860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2199860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22312af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2238cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2239cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2244cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2245cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0);
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2250cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2251cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0);
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
22702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
22712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2272a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <path-permission>: "
2273a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2274a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
22752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
22762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
22772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
22792af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
22802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
22822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn            } else if (parser.getName().equals("path-permission")) {
22842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                TypedArray sa = res.obtainAttributes(attrs,
22852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission);
22862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                PathPermission pa = null;
22882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2289cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String permission = sa.getNonConfigurationString(
2290cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0);
2291cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String readPermission = sa.getNonConfigurationString(
2292cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0);
22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission == null) {
22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = permission;
22952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
2296cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String writePermission = sa.getNonConfigurationString(
2297cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0);
22982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission == null) {
22992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = permission;
23002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23012af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                boolean havePerm = false;
23032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission != null) {
23042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = readPermission.intern();
23052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
23062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission != null) {
2308e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert                    writePermission = writePermission.intern();
23092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
23102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (!havePerm) {
23132af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2314a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No readPermission or writePermssion for <path-permission>: "
2315a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2316a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
23172af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
23182af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
23192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No readPermission or writePermssion for <path-permission>";
23212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
23222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2324cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String path = sa.getNonConfigurationString(
2325cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0);
23262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
23292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2331cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2332cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0);
23332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
23362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2338cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2339cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0);
23402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23412af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23422af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
23432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                sa.recycle();
23462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (pa != null) {
23482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (outInfo.info.pathPermissions == null) {
23492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = new PathPermission[1];
23502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions[0] = pa;
23512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    } else {
23522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        final int N = outInfo.info.pathPermissions.length;
23532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        PathPermission[] newp = new PathPermission[N+1];
23542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
23552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        newp[N] = pa;
23562af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = newp;
23572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
23592af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2360a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
2361a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2362a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
23632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
23642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
23652af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23662af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
23672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
2374a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2375a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
23941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
23951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
23961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
2397234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon, 0,
23981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
23991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
24008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_description,
24011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
24021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
24031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
24041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
24061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
24071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
24091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2421cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2422cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestService_permission, 0);
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
2432860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have services in its main process
2433860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2434860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (s.info.processName == owner.packageName) {
2435860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have services in main process";
2436860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2437860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2438860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2439860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
2464a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2465a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
2503a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2504a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2528cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
2529cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestMetaData_name, 0);
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2536854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        name = name.intern();
2537854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
2550854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    data.putString(name, cs != null ? cs.toString().intern() : null);
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
2560a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
2561a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2562a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
2596a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    + mArchiveSourcePath + " "
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
261081cd2e90ccdda498234384c8207afe2213714e60Adam Powell
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2647cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2648cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_mimeType, 0);
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2660cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_scheme, 0);
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2665cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String host = sa.getNonConfigurationString(
2666cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_host, 0);
2667cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String port = sa.getNonConfigurationString(
2668cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_port, 0);
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2673cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2674cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_path, 0);
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2680cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0);
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2685cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2686cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0);
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
2694a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                Log.w(TAG, "Unknown element under <intent-filter>: "
2695a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getName() + " at " + mArchiveSourcePath + " "
2696a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getPositionDescription());
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
27196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String packageName;
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2734854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        public ArrayList<String> protectedBroadcasts;
2735854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
273649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesLibraries = null;
273749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesOptionalLibraries = null;
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2740c1552397be706c243338389c628a44eee6011eaeDianne Hackborn        public ArrayList<String> mOriginalPackages = null;
27416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String mRealPackage = null;
2742b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn        public ArrayList<String> mAdoptPermissions = null;
2743b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27695c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by the package manager to keep track of the path to the
27705c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // file an app came from.
27715c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public String mScanPath;
27725c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
27735c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager to keep track of where it has done dexopt.
27745c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mDidDexOpt;
27755c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
277646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        // User set enabled state.
277746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
277846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
2781deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root
2782deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root        // Whether an operation is currently pending on this package
2783deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root        public boolean mOperationPending;
2784deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        /*
279249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         *  Applications requested features
279349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         */
279449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<FeatureInfo> reqFeatures = null;
279549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
2796117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        public int installLocation;
2797117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28046dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String newName) {
28056dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            packageName = newName;
28066dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            applicationInfo.packageName = newName;
28076dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissions.size()-1; i>=0; i--) {
28086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissions.get(i).setPackageName(newName);
28096dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28106dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissionGroups.size()-1; i>=0; i--) {
28116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissionGroups.get(i).setPackageName(newName);
28126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=activities.size()-1; i>=0; i--) {
28146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                activities.get(i).setPackageName(newName);
28156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=receivers.size()-1; i>=0; i--) {
28176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                receivers.get(i).setPackageName(newName);
28186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=providers.size()-1; i>=0; i--) {
28206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                providers.get(i).setPackageName(newName);
28216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=services.size()-1; i>=0; i--) {
28236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                services.get(i).setPackageName(newName);
28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=instrumentation.size()-1; i>=0; i--) {
28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                instrumentation.get(i).setPackageName(newName);
28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
28391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public final String className;
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        ComponentName componentName;
28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        String componentShortName;
28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
28481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
28496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = null;
28501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
28511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
28531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
28541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
2855cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String name = args.sa.getNonConfigurationString(args.nameRes, 0);
28561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
28576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
28581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
28591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
28631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
28641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
28656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
28661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
28671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28706dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = outInfo.name;
28711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
28731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
28741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
28751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
28761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
287781cd2e90ccdda498234384c8207afe2213714e60Adam Powell
28781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
28791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
28801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
28811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
28841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
28851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
28871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
28881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
28891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
2893d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                CharSequence pname;
2894d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
2895d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonConfigurationString(args.processRes, 0);
2896d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                } else {
2897d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // Some older apps have been seen to use a resource reference
2898d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // here that on older builds was ignored (with a warning).  We
2899d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // need to continue to do this for them so they don't break.
2900d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonResourceString(args.processRes);
2901d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                }
29021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
2903d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        owner.applicationInfo.processName, pname,
29041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
29051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
29068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
29078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            if (args.descriptionRes != 0) {
29088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0);
29098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
29108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
29111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
29161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
29176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = clone.className;
29186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = clone.componentName;
29191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
29206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public ComponentName getComponentName() {
29236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentName != null) {
29246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentName;
29256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (className != null) {
29276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentName = new ComponentName(owner.applicationInfo.packageName,
29286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                        className);
29296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentName;
29316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String getComponentShortName() {
29346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentShortName != null) {
29356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentShortName;
29366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            ComponentName component = getComponentName();
29386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (component != null) {
29396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentShortName = component.flattenToShortString();
29406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentShortName;
29426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = null;
29466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentShortName = null;
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
29676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
29686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
29926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
29936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
300346730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
300446730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
300546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            if (p.applicationInfo.enabled != enabled) {
300646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn                return true;
300746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            }
300846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        }
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
302369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // CompatibilityMode is global state. It's safe to modify the instance
302469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // of the package.
302569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            if (!sCompatibilityModeEnabled) {
302669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima                p.applicationInfo.disableCompatibilityMode();
302769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            }
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
303969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        if (!sCompatibilityModeEnabled) {
304069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            ai.disableCompatibilityMode();
304169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        }
304246730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        ai.enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
30691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
30721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
30731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
30741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
30786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
30796dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
30806dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30816dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30856dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
31031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
31061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
31081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
31401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
31411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
31421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
31831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
31861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
31871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31986dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
321881cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public int logo;
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
324869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
324969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    /**
325069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     * @hide
325169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     */
325269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
325369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        sCompatibilityModeEnabled = compatibilityModeEnabled;
325469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    }
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3256