PackageParser.java revision 529b60a3b16ac3dff24f2403d760ab8ebc9670ff
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 android.content.ComponentName;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
278d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapuimport android.os.Build;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
352269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils;
36529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport org.xmlpull.v1.XmlPullParser;
37529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport org.xmlpull.v1.XmlPullParserException;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
57a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
58a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
59a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
60a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
7645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
7745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
785a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
7945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
82a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
868d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final int SDK_VERSION = Build.VERSION.SDK_INT;
878d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME)
888d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu            ? null : Build.VERSION.CODENAME;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static boolean sCompatibilityModeEnabled = true;
9690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
9769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
10481cd2e90ccdda498234384c8207afe2213714e60Adam Powell        final int logoRes;
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
11081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes) {
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
11681cd2e90ccdda498234384c8207afe2213714e60Adam Powell            logoRes = _logoRes;
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        final int descriptionRes;
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
12881cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes,
1298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String[] _sepProcesses, int _processRes,
1308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                int _descriptionRes, int _enabledRes) {
13181cd2e90ccdda498234384c8207afe2213714e60Adam Powell            super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes);
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            descriptionRes = _descriptionRes;
1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
138a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
139a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /* Light weight package info.
140a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @hide
141a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
142a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static class PackageLite {
143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String packageName;
144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public int installLocation;
145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public String mScanPath;
146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        public PackageLite(String packageName, int installLocation) {
147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.packageName = packageName;
148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.installLocation = installLocation;
149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
1521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gids[], int flags) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
194117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pi.installLocation = p.installLocation;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
20249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.configPreferences.toArray(pi.configPreferences);
20349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
20449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            N = p.reqFeatures != null ? p.reqFeatures.size() : 0;
20549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            if (N > 0) {
20649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pi.reqFeatures = new FeatureInfo[N];
20749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.reqFeatures.toArray(pi.reqFeatures);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2137eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2147eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[N];
2157eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2167eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2177eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2187eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.activities.get(i).info.enabled) num++;
2197eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[num];
2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
222d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
226d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2347eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2357eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[N];
2367eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2377eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2387eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2397eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.receivers.get(i).info.enabled) num++;
2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[num];
2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
243d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
247d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2557eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2567eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[N];
2577eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2587eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2597eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2607eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.services.get(i).info.enabled) num++;
2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[num];
2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
264d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
268d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.services[j++] = generateServiceInfo(p.services.get(i), flags);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2767eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2777eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[N];
2787eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2797eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2807eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2817eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.providers.get(i).info.enabled) num++;
2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[num];
2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
285d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
289d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
321d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
322d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           if (N > 0) {
323d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                pi.signatures = new Signature[N];
324d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is = jarFile.getInputStream(je);
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
3446e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn        } catch (RuntimeException e) {
3456e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn            Log.w(TAG, "Exception reading " + je.getName() + " in "
3466e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn                    + jarFile.getName(), e);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
351af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IS_SYSTEM = 1<<0;
352af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_CHATTY = 1<<1;
353af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_MUST_BE_APK = 1<<2;
354af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IGNORE_PROCESSES = 1<<3;
355af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_FORWARD_LOCK = 1<<4;
356af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_ON_SDCARD = 1<<5;
357806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn    public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
363af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public Package parsePackage(File sourceFile, String destCodePath,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
392b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
393b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
394b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
440af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        // Set code and resource paths
441af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mPath = destCodePath;
442af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mScanPath = mArchiveSourcePath;
443af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.sourceDir = destCodePath;
444af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.publicSourceDir = destRes;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
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            }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
581a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /*
582a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * Utility method that retrieves just the package name and install
583a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * location from the apk location at the given file path.
584a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param packageFilePath file location of the apk
585a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param flags Special parse flags
586930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root     * @return PackageLite object with package information or null on failure.
587a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
588a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static PackageLite parsePackageLite(String packageFilePath, int flags) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
603a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        PackageLite packageLite = null;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
605a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            packageLite = parsePackageLite(parser, attrs, flags, errors);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
614a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (packageLite == null) {
615a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            Log.e(TAG, "parsePackageLite error: " + errors[0]);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
618a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return packageLite;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
682a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    private static PackageLite parsePackageLite(XmlPullParser parser,
683a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            AttributeSet attrs, int flags, String[] outError)
684a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            throws IOException, XmlPullParserException {
685a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
686a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        int type;
687a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        while ((type=parser.next()) != parser.START_TAG
688a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                   && type != parser.END_DOCUMENT) {
689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            ;
690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (type != parser.START_TAG) {
693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No start tag found";
694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            TAG, "Root element name: '" + parser.getName() + "'");
698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (!parser.getName().equals("manifest")) {
699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No <manifest> tag";
700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String pkgName = attrs.getAttributeValue(null, "package");
703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (pkgName == null || pkgName.length() == 0) {
704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> does not specify package";
705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String nameError = validateName(pkgName, true);
708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (nameError != null && !"android".equals(pkgName)) {
709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> specifies bad package name \""
710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                + pkgName + "\": " + nameError;
711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
712a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
71390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu        int installLocation = PARSE_DEFAULT_INSTALL_LOCATION;
714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        for (int i = 0; i < attrs.getAttributeCount(); i++) {
715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            String attr = attrs.getAttributeName(i);
716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            if (attr.equals("installLocation")) {
717a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                installLocation = attrs.getAttributeIntValue(i,
71890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                        PARSE_DEFAULT_INSTALL_LOCATION);
719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                break;
720a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            }
721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return new PackageLite(pkgName.intern(), installLocation);
723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
724a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
7431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
7441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
7451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
7461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        pkg.mVersionName = sa.getNonConfigurationString(
762cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_versionName, 0);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
766cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0);
768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        if (str != null && str.length() > 0) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
781aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu
782117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pkg.installLocation = sa.getInteger(
783117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu                com.android.internal.R.styleable.AndroidManifest_installLocation,
78490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                PARSE_DEFAULT_INSTALL_LOCATION);
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
786723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        // Resource boolean are -1, so 1 means we don't know the value.
787723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsSmallScreens = 1;
788723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsNormalScreens = 1;
789723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsLargeScreens = 1;
79014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        int supportsXLargeScreens = 1;
791c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        int resizeable = 1;
79211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        int anyDensity = 1;
793723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
835cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
836cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
843854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    pkg.requestedPermissions.add(name.intern());
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
876d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu            } else if (tagName.equals("uses-feature")) {
87749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                FeatureInfo fi = new FeatureInfo();
878d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa = res.obtainAttributes(attrs,
879d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                        com.android.internal.R.styleable.AndroidManifestUsesFeature);
880cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
881cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
88249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                fi.name = sa.getNonResourceString(
88349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_name);
88449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.reqGlEsVersion = sa.getInt(
88649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion,
88749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            FeatureInfo.GL_ES_VERSION_UNDEFINED);
88849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
88949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (sa.getBoolean(
89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_required,
89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true)) {
89249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.flags |= FeatureInfo.FLAG_REQUIRED;
89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
894d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa.recycle();
89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (pkg.reqFeatures == null) {
89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.reqFeatures = new ArrayList<FeatureInfo>();
89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pkg.reqFeatures.add(fi);
89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    ConfigurationInfo cPref = new ConfigurationInfo();
90249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    cPref.reqGlEsVersion = fi.reqGlEsVersion;
90349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.configPreferences.add(cPref);
90449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
905d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
906d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                XmlUtils.skipCurrentTag(parser);
907d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
908851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
9098d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                if (SDK_VERSION > 0) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
913851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
914851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
915851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
917851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
918851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
919851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
920851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
923851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
9255c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            targetVers = minVers = val.data;
926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
933851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
938851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
939851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9425c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    if (minCode != null) {
9438d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!minCode.equals(SDK_CODENAME)) {
9448d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
9455c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9468d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
9475c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            } else {
9485c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
9495c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " but this is a release platform.";
9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            }
9515c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9525c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            return null;
9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        }
9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                    } else if (minVers > SDK_VERSION) {
9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
9568d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                + " (current version is #" + SDK_VERSION + ")";
9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        return null;
9595c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    }
9605c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
961851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
9628d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!targetCode.equals(SDK_CODENAME)) {
9638d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
964851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
9658d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
966851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
967851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
968851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
970851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
971851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
972851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
973851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
974a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
975a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
976a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
977a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
978851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
983723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else if (tagName.equals("supports-screens")) {
984723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa = res.obtainAttributes(attrs,
985723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens);
986723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
987723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is a trick to get a boolean and still able to detect
988723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // if a value was actually set.
989723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsSmallScreens = sa.getInteger(
990723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens,
991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsSmallScreens);
992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsNormalScreens = sa.getInteger(
993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens,
994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsNormalScreens);
995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsLargeScreens = sa.getInteger(
996723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens,
997723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsLargeScreens);
99814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                supportsXLargeScreens = sa.getInteger(
99914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens,
100014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        supportsXLargeScreens);
1001c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                resizeable = sa.getInteger(
1002c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable,
100314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        resizeable);
100411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                anyDensity = sa.getInteger(
100511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity,
100611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        anyDensity);
1007723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
1008723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa.recycle();
1009723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
10109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
1011854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1012854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("protected-broadcast")) {
1013854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa = res.obtainAttributes(attrs,
1014854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
1015854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1016cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1017cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
1018854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                String name = sa.getNonResourceString(
1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa.recycle();
1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
1024854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (pkg.protectedBroadcasts == null) {
1025854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts = new ArrayList<String>();
1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (!pkg.protectedBroadcasts.contains(name)) {
1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts.add(name.intern());
1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1034854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("instrumentation")) {
1035854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
1036854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    return null;
1037854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1038854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1039b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("original-package")) {
1040b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1041b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1042b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1043cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String orig =sa.getNonConfigurationString(
1044cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
10456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (!pkg.packageName.equals(orig)) {
1046c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    if (pkg.mOriginalPackages == null) {
1047c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mOriginalPackages = new ArrayList<String>();
1048c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mRealPackage = pkg.packageName;
1049c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    }
1050c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    pkg.mOriginalPackages.add(orig);
10516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                }
1052b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1053b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1054b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1055b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1056b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1057b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("adopt-permissions")) {
1058b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1059b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1061cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String name = sa.getNonConfigurationString(
1062cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
10666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (name != null) {
1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    if (pkg.mAdoptPermissions == null) {
1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        pkg.mAdoptPermissions = new ArrayList<String>();
1069b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    }
1070b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    pkg.mAdoptPermissions.add(name);
1071b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                }
1072b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1073b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1074b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1075854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("eat-comment")) {
1076854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                // Just skip this tag
1077854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1078854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                continue;
1079854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1080854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (RIGID_PARSER) {
1081854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                outError[0] = "Bad element under <manifest>: "
1082854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    + parser.getName();
1083854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
1084854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                return null;
1085854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1087bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                Log.w(TAG, "Unknown element under <manifest>: " + parser.getName()
1088bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + " at " + mArchiveSourcePath + " "
1089bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + parser.getPositionDescription());
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
1101a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        StringBuilder implicitPerms = null;
1102a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
1103a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
1104a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
1105a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
1106a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
1107a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1108a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (implicitPerms == null) {
1110a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms = new StringBuilder(128);
1111a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(pkg.packageName);
1112a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(": compat added ");
1113a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                } else {
1114a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(' ');
1115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
1116a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                implicitPerms.append(npi.name);
1117a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
1118a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1119851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
1120a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        if (implicitPerms != null) {
1121a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn            Log.i(TAG, implicitPerms.toString());
1122a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        }
1123851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1124723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
1125723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
112611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1127723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
1128723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1129723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsNormalScreens != 0) {
1130723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS;
1131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1132723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsLargeScreens < 0 || (supportsLargeScreens > 0
1133723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1135723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
1136723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
113714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0
113814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
113914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        >= android.os.Build.VERSION_CODES.GINGERBREAD)) {
114014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS;
114114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        }
1142c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (resizeable < 0 || (resizeable > 0
1143c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
114411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1145c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS;
1146c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
114711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        if (anyDensity < 0 || (anyDensity > 0
114811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
114911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
115011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
11511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        }
11521ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1225d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        return buildCompoundName(pkg, procSeq, "process", outError);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
125181cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon,
125281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionGroup_logo)) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
128781cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermission_icon,
128881cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermission_logo)) {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1294cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1295cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
134181cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon,
134281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionTree_logo)) {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
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        sa.recycle();
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
13831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
13841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
13851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
138681cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon,
138781cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestInstrumentation_logo);
13881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
13891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
13901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
13921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
13931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
13941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
13951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1402cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1403cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1444cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
1445cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_name, 0);
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1455cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String manageSpaceActivity = sa.getNonConfigurationString(
1456cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0);
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1462181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1463181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1464181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1465181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
14665e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14673de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant
14683de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // if backup is possible for the given application.
1469cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String backupAgent = sa.getNonConfigurationString(
1470cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0);
1471181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1472181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1473a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (false) {
1474a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
1475a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " from " + pkgName + "+" + backupAgent);
1476a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
14775e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
14785e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14795e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
14805e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        true)) {
14815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
14825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
14835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
14843dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion,
14853dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        false)) {
14863dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
14873dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                }
1488181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1489181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
1490181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
149981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        ai.logo = sa.getResourceId(
150081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestApplication_logo, 0);
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1514af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_FORWARD_LOCK) != 0) {
1515af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
1516af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1517af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
1518af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_ON_SDCARD) != 0) {
15196069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
1520af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1521af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
1529ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng                com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode,
153023085b781e145ed684e7270af1d5ced6800b8effBen Cheng                false)) {
153123085b781e145ed684e7270af1d5ced6800b8effBen Cheng            ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE;
153223085b781e145ed684e7270af1d5ced6800b8effBen Cheng        }
153323085b781e145ed684e7270af1d5ced6800b8effBen Cheng
1534529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy        boolean hardwareAccelerated = sa.getBoolean(
1535812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated,
1536529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                false);
1537812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1538812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (sa.getBoolean(
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1556ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1557ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1558e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1559ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1560ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1561ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
15621874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        if (sa.getBoolean(
15631874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt,
15641874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor                false)) {
15651874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor            ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT;
15661874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor        }
15671874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1569cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1570cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_permission, 0);
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1573d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1574d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonConfigurationString(
1575d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0);
1576d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        } else {
1577d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // Some older apps have been seen to use a resource reference
1578d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // here that on older builds was ignored (with a warning).  We
1579d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // need to continue to do this for them so they don't break.
1580d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonResourceString(
1581d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
1582d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        }
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
1587d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            CharSequence pname;
1588d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1589d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonConfigurationString(
1590d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process, 0);
1591d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            } else {
1592d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // Some older apps have been seen to use a resource reference
1593d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // here that on older builds was ignored (with a warning).  We
1594d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // need to continue to do this for them so they don't break.
1595d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonResourceString(
1596d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process);
1597d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            }
1598d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            ai.processName = buildProcessName(ai.packageName, null, pname,
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1601cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            ai.enabled = sa.getBoolean(
1602cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
1603860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
1604860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (sa.getBoolean(
1605860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_heavyWeight,
1606860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                    false)) {
1607860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                ai.flags |= ApplicationInfo.FLAG_HEAVY_WEIGHT;
1608860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
1609860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                // A heavy-weight application can not be in a custom process.
1610860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                // We can do direct compare because we intern all strings.
1611860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                if (ai.processName != null && ai.processName != ai.packageName) {
1612860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                    outError[0] = "Heavy-weight applications can not use custom processes";
1613860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                }
1614860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
1635529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false,
1636529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                        hardwareAccelerated);
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
1645529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false);
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
16721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1695cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
169849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                boolean req = sa.getBoolean(
169949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_required,
170049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true);
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
170449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (lname != null) {
170549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    if (req) {
170649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesLibraries == null) {
170749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries = new ArrayList<String>();
170849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
170949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesLibraries.contains(lname)) {
171049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries.add(lname.intern());
171149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    } else {
171349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesOptionalLibraries == null) {
171449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries = new ArrayList<String>();
171549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesOptionalLibraries.contains(lname)) {
171749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries.add(lname.intern());
171849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
171949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    }
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1726a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <application>: " + tagName
1727a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1728a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
174481cd2e90ccdda498234384c8207afe2213714e60Adam Powell            int nameRes, int labelRes, int iconRes, int logoRes) {
1745cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(nameRes, 0);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
176281cd2e90ccdda498234384c8207afe2213714e60Adam Powell
176381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        int logoVal = sa.getResourceId(logoRes, 0);
176481cd2e90ccdda498234384c8207afe2213714e60Adam Powell        if (logoVal != 0) {
176581cd2e90ccdda498234384c8207afe2213714e60Adam Powell            outInfo.logo = logoVal;
176681cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
1780529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            boolean receiver, boolean hardwareAccelerated)
1781529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            throws XmlPullParserException, IOException {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
17861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
17871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
17881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
17891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
179081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestActivity_logo,
17911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
17921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
17938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_description,
17941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
17951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
17961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
17981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
17991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
18001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
18011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
18021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1818cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1819cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_permission, 0);
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1826cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1827cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0);
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1880ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        if (sa.getBoolean(
1881ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs,
1882ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                false)) {
1883ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
1884ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
1885ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
1886613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler        if (sa.getBoolean(
1887613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler                com.android.internal.R.styleable.AndroidManifestActivity_immersive,
1888613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler                false)) {
1889613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler            a.info.flags |= ActivityInfo.FLAG_IMMERSIVE;
1890613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler        }
1891529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
1893529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            if (sa.getBoolean(
1894529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                    com.android.internal.R.styleable.AndroidManifestActivity_hardwareAccelerated,
1895529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                    hardwareAccelerated)) {
1896529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED;
1897529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            }
1898529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1918860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) {
1919860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have receives in its main process
1920860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
1921860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (a.info.processName == owner.packageName) {
1922860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have receivers in main process";
1923860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
1924860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
1925860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
1945bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
1946bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
1947bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
1960a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()
1961a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1962a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1964a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName()
1965a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
1966a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
19881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
19891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1993cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String targetActivity = sa.getNonConfigurationString(
1994cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0);
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
20091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
20101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
20111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
20121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
201381cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestActivityAlias_logo,
20141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
20151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
20168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_description,
20171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
20181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
20191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
20201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
20221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
20231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
20431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
20441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
20451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
20461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
204781cd2e90ccdda498234384c8207afe2213714e60Adam Powell        info.logo = target.info.logo;
20481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
20491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
20501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
20511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
20528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        if (info.descriptionRes == 0) {
20538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            info.descriptionRes = target.info.descriptionRes;
20548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
20551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
20561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
20571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
20581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
20591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
20601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
2073cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2074cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0);
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
2100bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                    Log.w(TAG, "No actions in intent filter at "
2101bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
2102bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2113a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
2114a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
2115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
21381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
21391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
21401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
21411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
214281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestProvider_logo,
21431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
21441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
21458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_description,
21461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
21471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
21481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
21491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
21511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
21521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
21541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2162cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String cpname = sa.getNonConfigurationString(
2163cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0);
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String permission = sa.getNonConfigurationString(
2170cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_permission, 0);
2171cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2172cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2182cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2183cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0);
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2208860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) {
2209860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have providers in its main process
2210860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2211860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (p.info.processName == owner.packageName) {
2212860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have providers in main process";
2213860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2214860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2215860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2216860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2255cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2256cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0);
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2261cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2262cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0);
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2267cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2268cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0);
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
22872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
22882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2289a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "Unknown element under <path-permission>: "
2290a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2291a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
22922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
22952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
22962af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
22972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
22982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
22992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn            } else if (parser.getName().equals("path-permission")) {
23012af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                TypedArray sa = res.obtainAttributes(attrs,
23022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission);
23032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                PathPermission pa = null;
23052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2306cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String permission = sa.getNonConfigurationString(
2307cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0);
2308cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String readPermission = sa.getNonConfigurationString(
2309cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0);
23102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission == null) {
23112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = permission;
23122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
2313cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String writePermission = sa.getNonConfigurationString(
2314cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0);
23152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission == null) {
23162af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = permission;
23172af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23182af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                boolean havePerm = false;
23202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission != null) {
23212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = readPermission.intern();
23222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
23232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23242af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission != null) {
2325e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert                    writePermission = writePermission.intern();
23262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
23272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (!havePerm) {
23302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2331a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No readPermission or writePermssion for <path-permission>: "
2332a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2333a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
23342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
23352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
23362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No readPermission or writePermssion for <path-permission>";
23382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
23392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2341cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String path = sa.getNonConfigurationString(
2342cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0);
23432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
23462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2348cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2349cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0);
23502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
23532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2355cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2356cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0);
23572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
23582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
23592af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
23602af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
23612af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                sa.recycle();
23632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (pa != null) {
23652af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (outInfo.info.pathPermissions == null) {
23662af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = new PathPermission[1];
23672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions[0] = pa;
23682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    } else {
23692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        final int N = outInfo.info.pathPermissions.length;
23702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        PathPermission[] newp = new PathPermission[N+1];
23712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
23722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        newp[N] = pa;
23732af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = newp;
23742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
23762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2377a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
2378a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2379a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
23802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
23812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
23822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
23832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
23842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
2391a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2392a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
24111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
24121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
24131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
24141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
241581cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestService_logo,
24161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
24171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
24188aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_description,
24191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
24201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
24211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
24221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
24241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
24251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
24271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2440cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestService_permission, 0);
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) {
2450860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have services in its main process
2451860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2452860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (s.info.processName == owner.packageName) {
2453860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have services in main process";
2454860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2455860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2456860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2457860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
2482a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2483a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
2521a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2522a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2546cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
2547cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestMetaData_name, 0);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2554854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        name = name.intern();
2555854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
2568854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    data.putString(name, cs != null ? cs.toString().intern() : null);
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
2578a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
2579a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2580a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    + mArchiveSourcePath + " "
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
262881cd2e90ccdda498234384c8207afe2213714e60Adam Powell
262981cd2e90ccdda498234384c8207afe2213714e60Adam Powell        outInfo.logo = sa.getResourceId(
263081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestIntentFilter_logo, 0);
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2668cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2669cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_mimeType, 0);
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2680cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2681cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_scheme, 0);
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2686cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String host = sa.getNonConfigurationString(
2687cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_host, 0);
2688cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String port = sa.getNonConfigurationString(
2689cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_port, 0);
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2695cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_path, 0);
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2700cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2701cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0);
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2706cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2707cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0);
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
2715a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                Log.w(TAG, "Unknown element under <intent-filter>: "
2716a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getName() + " at " + mArchiveSourcePath + " "
2717a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getPositionDescription());
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
27406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String packageName;
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2755854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        public ArrayList<String> protectedBroadcasts;
2756854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
275749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesLibraries = null;
275849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesOptionalLibraries = null;
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2761c1552397be706c243338389c628a44eee6011eaeDianne Hackborn        public ArrayList<String> mOriginalPackages = null;
27626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String mRealPackage = null;
2763b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn        public ArrayList<String> mAdoptPermissions = null;
2764b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27905c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by the package manager to keep track of the path to the
27915c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // file an app came from.
27925c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public String mScanPath;
27935c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
27945c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager to keep track of where it has done dexopt.
27955c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mDidDexOpt;
27965c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
279746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        // User set enabled state.
279846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
279946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
280949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        /*
281049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         *  Applications requested features
281149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         */
281249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<FeatureInfo> reqFeatures = null;
281349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
2814117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        public int installLocation;
2815117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String newName) {
28236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            packageName = newName;
28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            applicationInfo.packageName = newName;
28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissions.size()-1; i>=0; i--) {
28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissions.get(i).setPackageName(newName);
28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissionGroups.size()-1; i>=0; i--) {
28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissionGroups.get(i).setPackageName(newName);
28306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=activities.size()-1; i>=0; i--) {
28326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                activities.get(i).setPackageName(newName);
28336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=receivers.size()-1; i>=0; i--) {
28356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                receivers.get(i).setPackageName(newName);
28366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=providers.size()-1; i>=0; i--) {
28386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                providers.get(i).setPackageName(newName);
28396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=services.size()-1; i>=0; i--) {
28416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                services.get(i).setPackageName(newName);
28426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=instrumentation.size()-1; i>=0; i--) {
28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                instrumentation.get(i).setPackageName(newName);
28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
28466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
28476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
28571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
28586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public final String className;
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        ComponentName componentName;
28626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        String componentShortName;
28636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
28661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
28676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = null;
28681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
28691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
28711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
28721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
2873cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String name = args.sa.getNonConfigurationString(args.nameRes, 0);
28741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
28756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
28761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
28771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
28811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
28821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
28836dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
28841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
28851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
28861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
28871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = outInfo.name;
28891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
28901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
28911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
28921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
28931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
28941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
289581cd2e90ccdda498234384c8207afe2213714e60Adam Powell
289681cd2e90ccdda498234384c8207afe2213714e60Adam Powell            int logoVal = args.sa.getResourceId(args.logoRes, 0);
289781cd2e90ccdda498234384c8207afe2213714e60Adam Powell            if (logoVal != 0) {
289881cd2e90ccdda498234384c8207afe2213714e60Adam Powell                outInfo.logo = logoVal;
289981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            }
29001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
29011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
29021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
29031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
29041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
29051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
29061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
29071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
29081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
29091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
29101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
29111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
29121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
29131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
29141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
29151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
2916d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                CharSequence pname;
2917d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
2918d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonConfigurationString(args.processRes, 0);
2919d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                } else {
2920d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // Some older apps have been seen to use a resource reference
2921d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // here that on older builds was ignored (with a warning).  We
2922d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // need to continue to do this for them so they don't break.
2923d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonResourceString(args.processRes);
2924d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                }
29251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
2926d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        owner.applicationInfo.processName, pname,
29271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
29281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
29298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
29308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            if (args.descriptionRes != 0) {
29318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0);
29328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
29338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
29341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
29391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
29406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = clone.className;
29416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = clone.componentName;
29421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
29436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public ComponentName getComponentName() {
29466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentName != null) {
29476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentName;
29486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (className != null) {
29506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentName = new ComponentName(owner.applicationInfo.packageName,
29516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                        className);
29526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentName;
29546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String getComponentShortName() {
29576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentShortName != null) {
29586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentShortName;
29596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            ComponentName component = getComponentName();
29616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (component != null) {
29626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentShortName = component.flattenToShortString();
29636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
29646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentShortName;
29656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = null;
29696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentShortName = null;
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
29886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
29896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
29906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
29916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
30146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
30156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
30166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
302646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
302746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
302846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            if (p.applicationInfo.enabled != enabled) {
302946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn                return true;
303046730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            }
303146730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        }
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
304669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // CompatibilityMode is global state. It's safe to modify the instance
304769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // of the package.
304869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            if (!sCompatibilityModeEnabled) {
304969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima                p.applicationInfo.disableCompatibilityMode();
305069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            }
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
306269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        if (!sCompatibilityModeEnabled) {
306369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            ai.disableCompatibilityMode();
306469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        }
306546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        ai.enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
30921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
30951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
30961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
30971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31006dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31016dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31026dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31036dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31046dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
31261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
31291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
31301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
31311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
31631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
31641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
31651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31766dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31796dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
32061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
32091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
32101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
32136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
32146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
32156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
32166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
32176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
324181cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public int logo;
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
327169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
327269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    /**
327369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     * @hide
327469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     */
327569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
327669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        sCompatibilityModeEnabled = compatibilityModeEnabled;
327769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    }
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3279