PackageParser.java revision ef3f5ddc2137ed99e41f00441b688fb56b855179
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
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
825a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
8345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
8445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
8545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
86a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
908d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final int SDK_VERSION = Build.VERSION.SDK_INT;
918d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME)
928d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu            ? null : Build.VERSION.CODENAME;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static boolean sCompatibilityModeEnabled = true;
10090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
10169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes) {
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1258aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        final int descriptionRes;
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes,
1318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String[] _sepProcesses, int _processRes,
1328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                int _descriptionRes, int _enabledRes) {
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(_owner, _outError, _nameRes, _labelRes, _iconRes);
1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            descriptionRes = _descriptionRes;
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
140a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
141a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /* Light weight package info.
142a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @hide
143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static class PackageLite {
145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String packageName;
146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public int installLocation;
147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String mScanPath;
148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public PackageLite(String packageName, int installLocation) {
149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.packageName = packageName;
150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.installLocation = installLocation;
151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
152a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
153a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gids[], int flags) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
196117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pi.installLocation = p.installLocation;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
20449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.configPreferences.toArray(pi.configPreferences);
20549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
20649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            N = p.reqFeatures != null ? p.reqFeatures.size() : 0;
20749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            if (N > 0) {
20849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pi.reqFeatures = new FeatureInfo[N];
20949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.reqFeatures.toArray(pi.reqFeatures);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2157eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2167eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[N];
2177eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2187eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2197eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.activities.get(i).info.enabled) num++;
2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2227eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[num];
2237eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
224d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
228d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2367eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2377eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[N];
2387eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2397eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.receivers.get(i).info.enabled) num++;
2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[num];
2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
245d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
249d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2577eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2587eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[N];
2597eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2607eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.services.get(i).info.enabled) num++;
2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[num];
2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
266d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
270d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.services[j++] = generateServiceInfo(p.services.get(i), flags);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2787eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2797eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[N];
2807eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2817eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.providers.get(i).info.enabled) num++;
2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[num];
2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
287d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
291d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
323d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
324d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           if (N > 0) {
325d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                pi.signatures = new Signature[N];
326d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is = jarFile.getInputStream(je);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
350af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IS_SYSTEM = 1<<0;
351af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_CHATTY = 1<<1;
352af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_MUST_BE_APK = 1<<2;
353af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IGNORE_PROCESSES = 1<<3;
354af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_FORWARD_LOCK = 1<<4;
355af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_ON_SDCARD = 1<<5;
356806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn    public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
362af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public Package parsePackage(File sourceFile, String destCodePath,
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
391b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
392b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
393b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        // Set code and resource paths
440af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mPath = destCodePath;
441af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mScanPath = mArchiveSourcePath;
442af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.sourceDir = destCodePath;
443af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.publicSourceDir = destRes;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
580a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /*
581a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * Utility method that retrieves just the package name and install
582a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * location from the apk location at the given file path.
583a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param packageFilePath file location of the apk
584a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param flags Special parse flags
585a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @return PackageLite object with package information.
586a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
587a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static PackageLite parsePackageLite(String packageFilePath, int flags) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
602a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        PackageLite packageLite = null;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
604a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            packageLite = parsePackageLite(parser, attrs, flags, errors);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
613a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (packageLite == null) {
614a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            Log.e(TAG, "parsePackageLite error: " + errors[0]);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
617a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return packageLite;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
681a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    private static PackageLite parsePackageLite(XmlPullParser parser,
682a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            AttributeSet attrs, int flags, String[] outError)
683a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            throws IOException, XmlPullParserException {
684a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
685a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        int type;
686a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        while ((type=parser.next()) != parser.START_TAG
687a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                   && type != parser.END_DOCUMENT) {
688a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            ;
689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (type != parser.START_TAG) {
692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No start tag found";
693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            TAG, "Root element name: '" + parser.getName() + "'");
697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (!parser.getName().equals("manifest")) {
698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No <manifest> tag";
699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String pkgName = attrs.getAttributeValue(null, "package");
702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (pkgName == null || pkgName.length() == 0) {
703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> does not specify package";
704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String nameError = validateName(pkgName, true);
707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (nameError != null && !"android".equals(pkgName)) {
708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> specifies bad package name \""
709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                + pkgName + "\": " + nameError;
710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
71290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu        int installLocation = PARSE_DEFAULT_INSTALL_LOCATION;
713a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        for (int i = 0; i < attrs.getAttributeCount(); i++) {
714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            String attr = attrs.getAttributeName(i);
715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            if (attr.equals("installLocation")) {
716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                installLocation = attrs.getAttributeIntValue(i,
71790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                        PARSE_DEFAULT_INSTALL_LOCATION);
718a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                break;
719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            }
720a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return new PackageLite(pkgName.intern(), installLocation);
722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
7421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
7431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
7441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
7451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
755851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
760cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        pkg.mVersionName = sa.getNonConfigurationString(
761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_versionName, 0);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
765cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
766cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0);
767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        if (str != null && str.length() > 0) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
780aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu
781117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pkg.installLocation = sa.getInteger(
782117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu                com.android.internal.R.styleable.AndroidManifest_installLocation,
78390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                PARSE_DEFAULT_INSTALL_LOCATION);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
785723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        // Resource boolean are -1, so 1 means we don't know the value.
786723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsSmallScreens = 1;
787723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsNormalScreens = 1;
788723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsLargeScreens = 1;
789c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        int resizeable = 1;
79011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        int anyDensity = 1;
791723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
833cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
834cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
841854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    pkg.requestedPermissions.add(name.intern());
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
874d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu            } else if (tagName.equals("uses-feature")) {
87549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                FeatureInfo fi = new FeatureInfo();
876d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa = res.obtainAttributes(attrs,
877d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                        com.android.internal.R.styleable.AndroidManifestUsesFeature);
878cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
879cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
88049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                fi.name = sa.getNonResourceString(
88149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_name);
88249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
88349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.reqGlEsVersion = sa.getInt(
88449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion,
88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            FeatureInfo.GL_ES_VERSION_UNDEFINED);
88649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
88749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (sa.getBoolean(
88849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_required,
88949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true)) {
89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.flags |= FeatureInfo.FLAG_REQUIRED;
89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
892d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa.recycle();
89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (pkg.reqFeatures == null) {
89449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.reqFeatures = new ArrayList<FeatureInfo>();
89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pkg.reqFeatures.add(fi);
89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    ConfigurationInfo cPref = new ConfigurationInfo();
90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    cPref.reqGlEsVersion = fi.reqGlEsVersion;
90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.configPreferences.add(cPref);
90249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
903d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
904d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                XmlUtils.skipCurrentTag(parser);
905d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
906851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
9078d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                if (SDK_VERSION > 0) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
911851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
912851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
913851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
914851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
915851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
917851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
918851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
919851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
920851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
9235c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            targetVers = minVers = val.data;
924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
925851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
933851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9405c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    if (minCode != null) {
9418d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!minCode.equals(SDK_CODENAME)) {
9428d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
9435c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9448d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
9455c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            } else {
9465c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9475c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " but this is a release platform.";
9485c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            }
9495c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            return null;
9515c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        }
9528d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                    } else if (minVers > SDK_VERSION) {
9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                + " (current version is #" + SDK_VERSION + ")";
9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9565c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        return null;
9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    }
9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
959851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
9608d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!targetCode.equals(SDK_CODENAME)) {
9618d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
962851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
9638d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
964851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
965851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
966851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
967851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
968851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
970851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
971851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
972a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
973a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
974a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
975a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
976851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
981723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else if (tagName.equals("supports-screens")) {
982723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa = res.obtainAttributes(attrs,
983723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens);
984723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
985723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is a trick to get a boolean and still able to detect
986723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // if a value was actually set.
987723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsSmallScreens = sa.getInteger(
988723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens,
989723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsSmallScreens);
990723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsNormalScreens = sa.getInteger(
991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens,
992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsNormalScreens);
993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsLargeScreens = sa.getInteger(
994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens,
995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsLargeScreens);
996c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                resizeable = sa.getInteger(
997c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable,
998c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        supportsLargeScreens);
99911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                anyDensity = sa.getInteger(
100011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity,
100111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        anyDensity);
1002723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
1003723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa.recycle();
1004723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
10059189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
1006854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1007854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("protected-broadcast")) {
1008854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa = res.obtainAttributes(attrs,
1009854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
1010854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1011cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1012cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
1013854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                String name = sa.getNonResourceString(
1014854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
1015854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1016854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa.recycle();
1017854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1018854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (pkg.protectedBroadcasts == null) {
1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts = new ArrayList<String>();
1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (!pkg.protectedBroadcasts.contains(name)) {
1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts.add(name.intern());
1024854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1025854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("instrumentation")) {
1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    return null;
1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1034b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("original-package")) {
1035b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1036b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1037b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1038cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String orig =sa.getNonConfigurationString(
1039cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
10406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (!pkg.packageName.equals(orig)) {
1041c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    if (pkg.mOriginalPackages == null) {
1042c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mOriginalPackages = new ArrayList<String>();
1043c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mRealPackage = pkg.packageName;
1044c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    }
1045c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    pkg.mOriginalPackages.add(orig);
10466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                }
1047b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1048b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1049b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1050b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1051b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1052b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("adopt-permissions")) {
1053b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1054b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1055b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1056cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String name = sa.getNonConfigurationString(
1057cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
1058b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1059b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
10616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (name != null) {
1062b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    if (pkg.mAdoptPermissions == null) {
1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        pkg.mAdoptPermissions = new ArrayList<String>();
1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    }
1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    pkg.mAdoptPermissions.add(name);
1066b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                }
1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1069b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1070854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("eat-comment")) {
1071854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                // Just skip this tag
1072854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1073854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                continue;
1074854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1075854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (RIGID_PARSER) {
1076854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                outError[0] = "Bad element under <manifest>: "
1077854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    + parser.getName();
1078854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
1079854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                return null;
1080854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1082bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                Log.w(TAG, "Unknown element under <manifest>: " + parser.getName()
1083bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + " at " + mArchiveSourcePath + " "
1084bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + parser.getPositionDescription());
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1095a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
1096a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        StringBuilder implicitPerms = null;
1097a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
1098a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
1099a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
1100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
1101a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
1102a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1103a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
1104a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (implicitPerms == null) {
1105a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms = new StringBuilder(128);
1106a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(pkg.packageName);
1107a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(": compat added ");
1108a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                } else {
1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(' ');
1110a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
1111a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                implicitPerms.append(npi.name);
1112a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
1113a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1114851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
1115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        if (implicitPerms != null) {
1116a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            Log.i(TAG, implicitPerms.toString());
1117a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        }
1118851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1119723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
1120723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
112111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1122723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
1123723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1124723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsNormalScreens != 0) {
1125723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS;
1126723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1127723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsLargeScreens < 0 || (supportsLargeScreens > 0
1128723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
112911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1130723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
1131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1132c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (resizeable < 0 || (resizeable > 0
1133c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1135c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS;
1136c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
113711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        if (anyDensity < 0 || (anyDensity > 0
113811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
113911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
114011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
11411ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        }
11421ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "package", outError);
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_icon)) {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1282cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1283cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) {
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
13701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
13711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
13721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
13731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon);
13741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
13751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
13761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
13781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
13801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
13811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1388cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1389cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1430cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
1431cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_name, 0);
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1441cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String manageSpaceActivity = sa.getNonConfigurationString(
1442cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1448181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1449181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1450181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1451181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
14525e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14533de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant
14543de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // if backup is possible for the given application.
1455cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String backupAgent = sa.getNonConfigurationString(
1456cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0);
1457181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1458181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1459a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (false) {
1460a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
1461a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " from " + pkgName + "+" + backupAgent);
1462a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
14635e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14645e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14655e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
14665e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        true)) {
14675e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
14685e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
14695e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14703dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion,
14713dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        false)) {
14723dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
14733dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                }
1474181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1475181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
1476181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1498af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_FORWARD_LOCK) != 0) {
1499af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
1500af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1501af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
1502af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_ON_SDCARD) != 0) {
15036069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
1504af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1505af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
1513ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng                com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode,
151423085b781e145ed684e7270af1d5ced6800b8effBen Cheng                false)) {
151523085b781e145ed684e7270af1d5ced6800b8effBen Cheng            ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE;
151623085b781e145ed684e7270af1d5ced6800b8effBen Cheng        }
151723085b781e145ed684e7270af1d5ced6800b8effBen Cheng
151823085b781e145ed684e7270af1d5ced6800b8effBen Cheng        if (sa.getBoolean(
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1536ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1537ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1538e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1539ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1540ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1541ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
15421874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        if (sa.getBoolean(
15431874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt,
15441874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                false)) {
15451874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor            ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT;
15461874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        }
15471874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1549cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1550cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_permission, 0);
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1553cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1554cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0);
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
1559cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            ai.processName = buildProcessName(ai.packageName, null, sa.getNonConfigurationString(
1560cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_process, 0),
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1563cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            ai.enabled = sa.getBoolean(
1564cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false);
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
16211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1643cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1644cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
164749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                boolean req = sa.getBoolean(
164849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_required,
164949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true);
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
165349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (lname != null) {
165449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    if (req) {
165549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesLibraries == null) {
165649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries = new ArrayList<String>();
165749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
165849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesLibraries.contains(lname)) {
165949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries.add(lname.intern());
166049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
166149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    } else {
166249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesOptionalLibraries == null) {
166349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries = new ArrayList<String>();
166449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
166549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesOptionalLibraries.contains(lname)) {
166649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries.add(lname.intern());
166749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
166849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    }
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1675a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <application>: " + tagName
1676a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1677a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes) {
1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(nameRes, 0);
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean receiver) throws XmlPullParserException, IOException {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
17291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
17301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
17311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
17321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
17331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
17358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_description,
17361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
17371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
17401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
17411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
17421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
17441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1760cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_permission, 0);
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1769cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0);
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1822ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        if (sa.getBoolean(
1823ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs,
1824ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                false)) {
1825ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
1826ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
1827ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
1867bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
1868bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
1869bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
1882a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()
1883a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1884a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1886a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName()
1887a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1888a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
19111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1915cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String targetActivity = sa.getNonConfigurationString(
1916cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0);
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
19321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
19331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
19341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
19351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
19378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_description,
19381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
19391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
19401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
19411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
19431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
19441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
19641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
19651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
19661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
19671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
19681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
19691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
19701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
19711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
19728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        if (info.descriptionRes == 0) {
19738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            info.descriptionRes = target.info.descriptionRes;
19748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
19751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
19761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
19771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
19781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
19801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1993cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1994cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0);
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
2020bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
2021bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
2022bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2033a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
2034a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
2035a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
20581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
20591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
20601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
20611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
20621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
20631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
20648aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_description,
20651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
20661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
20671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
20681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
20701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
20711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
20731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2081cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String cpname = sa.getNonConfigurationString(
2082cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0);
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2088cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String permission = sa.getNonConfigurationString(
2089cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_permission, 0);
2090cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2091cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0);
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2101cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2102cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0);
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2165cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2166cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0);
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2171cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2172cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2177cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2178cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0);
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
21972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
21982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2199a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <path-permission>: "
2200a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2201a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
22022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
22032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
22042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
22062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
22072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22082af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
22092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn            } else if (parser.getName().equals("path-permission")) {
22112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                TypedArray sa = res.obtainAttributes(attrs,
22122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission);
22132af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22142af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                PathPermission pa = null;
22152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2216cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String permission = sa.getNonConfigurationString(
2217cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0);
2218cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String readPermission = sa.getNonConfigurationString(
2219cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0);
22202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission == null) {
22212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = permission;
22222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
2223cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String writePermission = sa.getNonConfigurationString(
2224cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0);
22252af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission == null) {
22262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = permission;
22272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                boolean havePerm = false;
22302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission != null) {
22312af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = readPermission.intern();
22322af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
22332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission != null) {
2235e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert                    writePermission = writePermission.intern();
22362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
22372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (!havePerm) {
22402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2241a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No readPermission or writePermssion for <path-permission>: "
2242a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2243a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
22442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
22452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
22462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No readPermission or writePermssion for <path-permission>";
22482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
22492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2251cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String path = sa.getNonConfigurationString(
2252cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0);
22532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
22542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
22552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
22562af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2258cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2259cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0);
22602af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
22612af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
22622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
22632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2265cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2266cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0);
22672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
22682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
22692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
22702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                sa.recycle();
22732af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (pa != null) {
22752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (outInfo.info.pathPermissions == null) {
22762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = new PathPermission[1];
22772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions[0] = pa;
22782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    } else {
22792af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        final int N = outInfo.info.pathPermissions.length;
22802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        PathPermission[] newp = new PathPermission[N+1];
22812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
22822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        newp[N] = pa;
22832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = newp;
22842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
22862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2287a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
2288a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2289a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
22902af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
22912af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
22922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
2301a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2302a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
23278aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_description,
23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2348cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2349cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestService_permission, 0);
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
2382a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2383a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
2421a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2422a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2446cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
2447cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestMetaData_name, 0);
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2454854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        name = name.intern();
2455854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
2468854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    data.putString(name, cs != null ? cs.toString().intern() : null);
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
2478a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
2479a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2480a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
2514a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    + mArchiveSourcePath + " "
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2565cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2566cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_mimeType, 0);
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2577cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2578cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_scheme, 0);
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2583cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String host = sa.getNonConfigurationString(
2584cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_host, 0);
2585cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String port = sa.getNonConfigurationString(
2586cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_port, 0);
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2591cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2592cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_path, 0);
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2597cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2598cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0);
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2603cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2604cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0);
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
2612a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                Log.w(TAG, "Unknown element under <intent-filter>: "
2613a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getName() + " at " + mArchiveSourcePath + " "
2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getPositionDescription());
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
26376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String packageName;
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2652854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        public ArrayList<String> protectedBroadcasts;
2653854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
265449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesLibraries = null;
265549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesOptionalLibraries = null;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2658c1552397be706c243338389c628a44eee6011eaeDianne Hackborn        public ArrayList<String> mOriginalPackages = null;
26596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String mRealPackage = null;
2660b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn        public ArrayList<String> mAdoptPermissions = null;
2661b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26875c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by the package manager to keep track of the path to the
26885c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // file an app came from.
26895c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public String mScanPath;
26905c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
26915c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager to keep track of where it has done dexopt.
26925c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mDidDexOpt;
26935c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
270349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        /*
270449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         *  Applications requested features
270549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         */
270649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<FeatureInfo> reqFeatures = null;
270749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
2708117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        public int installLocation;
2709117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String newName) {
27176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            packageName = newName;
27186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            applicationInfo.packageName = newName;
27196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissions.size()-1; i>=0; i--) {
27206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissions.get(i).setPackageName(newName);
27216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissionGroups.size()-1; i>=0; i--) {
27236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissionGroups.get(i).setPackageName(newName);
27246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=activities.size()-1; i>=0; i--) {
27266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                activities.get(i).setPackageName(newName);
27276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=receivers.size()-1; i>=0; i--) {
27296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                receivers.get(i).setPackageName(newName);
27306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=providers.size()-1; i>=0; i--) {
27326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                providers.get(i).setPackageName(newName);
27336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=services.size()-1; i>=0; i--) {
27356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                services.get(i).setPackageName(newName);
27366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=instrumentation.size()-1; i>=0; i--) {
27386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                instrumentation.get(i).setPackageName(newName);
27396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
27406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
27416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
27511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
27526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public final String className;
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        ComponentName componentName;
27566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        String componentShortName;
27576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
27601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
27616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = null;
27621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
27631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
27651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
27661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
2767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String name = args.sa.getNonConfigurationString(args.nameRes, 0);
27681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
27696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
27701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
27711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
27721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
27731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
27751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
27761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
27776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
27781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
27791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
27801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
27811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27826dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = outInfo.name;
27831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
27851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
27861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
27871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
27881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
27891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
27911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
27921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
27931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
27941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
27961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
27971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
27981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
27991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
28001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
28011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
28051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
2806cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        owner.applicationInfo.processName,
2807cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        args.sa.getNonConfigurationString(args.processRes, 0),
28081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
28091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
28118aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            if (args.descriptionRes != 0) {
28128aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0);
28138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
28148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
28151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
28201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
28216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = clone.className;
28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = clone.componentName;
28231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public ComponentName getComponentName() {
28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentName != null) {
28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentName;
28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (className != null) {
28316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentName = new ComponentName(owner.applicationInfo.packageName,
28326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                        className);
28336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentName;
28356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String getComponentShortName() {
28386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentShortName != null) {
28396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentShortName;
28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            ComponentName component = getComponentName();
28426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (component != null) {
28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentShortName = component.flattenToShortString();
28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentShortName;
28466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
28496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = null;
28506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentShortName = null;
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
28706dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
28716dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
28726dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
28956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
28966dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
28976dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28986dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
292169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // CompatibilityMode is global state. It's safe to modify the instance
292269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // of the package.
292369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            if (!sCompatibilityModeEnabled) {
292469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima                p.applicationInfo.disableCompatibilityMode();
292569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
293769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        if (!sCompatibilityModeEnabled) {
293869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            ai.disableCompatibilityMode();
293969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        }
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
29661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
29691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
29701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
29711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
29746dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
29766dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
29776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29826dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
30001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
30031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
30041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
30051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
30096dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
30106dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
30116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
30371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
30381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
30391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
30506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
30516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
30526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
30801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
30831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
30841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
30886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
30896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
30906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
314469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
314569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    /**
314669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     * @hide
314769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     */
314869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
314969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        sCompatibilityModeEnabled = compatibilityModeEnabled;
315069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3152