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;
3105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport android.util.Base64;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
3305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport android.util.Log;
34d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Rootimport android.util.Slog;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
36a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport com.android.internal.util.XmlUtils;
37a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport org.xmlpull.v1.XmlPullParser;
38a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport org.xmlpull.v1.XmlPullParserException;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Rootimport java.io.BufferedInputStream;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
4505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.KeyFactory;
4605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.NoSuchAlgorithmException;
4705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.PublicKey;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
5005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.EncodedKeySpec;
5105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.InvalidKeySpecException;
5205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.X509EncodedKeySpec;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
5605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.util.List;
57bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Rootimport java.util.jar.Attributes;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
60d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Rootimport java.util.jar.Manifest;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
68d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root    private static final boolean DEBUG_JAR = false;
69d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root    private static final boolean DEBUG_PARSER = false;
70d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root    private static final boolean DEBUG_BACKUP = false;
71d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root
72bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root    /** File name in an APK for the Android manifest. */
73bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root    private static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml";
74bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
81a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
82a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
83a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
84a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
85a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
86a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
87a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
88a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
89a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
90a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
91a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
92a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
93a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
9445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
9545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
965a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
9745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
9845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
9945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
104d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn    private boolean mOnlyCoreApps;
1058d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final int SDK_VERSION = Build.VERSION.SDK_INT;
1068d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu    private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME)
1078d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu            ? null : Build.VERSION.CODENAME;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static boolean sCompatibilityModeEnabled = true;
11590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu    private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
11669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
12381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        final int logoRes;
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
12981cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes) {
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
13581cd2e90ccdda498234384c8207afe2213714e60Adam Powell            logoRes = _logoRes;
1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        final int descriptionRes;
1431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
14781cd2e90ccdda498234384c8207afe2213714e60Adam Powell                int _nameRes, int _labelRes, int _iconRes, int _logoRes,
1488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                String[] _sepProcesses, int _processRes,
1498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                int _descriptionRes, int _enabledRes) {
15081cd2e90ccdda498234384c8207afe2213714e60Adam Powell            super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes);
1511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            descriptionRes = _descriptionRes;
1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
157a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
158a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /* Light weight package info.
159a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @hide
160a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
161a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static class PackageLite {
16205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        public final String packageName;
16305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        public final int installLocation;
16405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        public final VerifierInfo[] verifiers;
16505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
16605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        public PackageLite(String packageName, int installLocation, List<VerifierInfo> verifiers) {
167a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.packageName = packageName;
168a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            this.installLocation = installLocation;
16905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]);
170a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
171a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
172a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
1731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
195d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn    public void setOnlyCoreApps(boolean onlyCoreApps) {
196d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn        mOnlyCoreApps = onlyCoreApps;
197d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn    }
198d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
21078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn            int gids[], int flags, long firstInstallTime, long lastUpdateTime) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
218e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        pi.applicationInfo = generateApplicationInfo(p, flags);
219117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pi.installLocation = p.installLocation;
22078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn        pi.firstInstallTime = firstInstallTime;
22178d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn        pi.lastUpdateTime = lastUpdateTime;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
22949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.configPreferences.toArray(pi.configPreferences);
23049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            }
23149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            N = p.reqFeatures != null ? p.reqFeatures.size() : 0;
23249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn            if (N > 0) {
23349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pi.reqFeatures = new FeatureInfo[N];
23449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                p.reqFeatures.toArray(pi.reqFeatures);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[N];
2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2457eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.activities.get(i).info.enabled) num++;
2467eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2477eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.activities = new ActivityInfo[num];
2487eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
249d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
253d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[N];
2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2667eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.receivers.get(i).info.enabled) num++;
2677eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2687eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.receivers = new ActivityInfo[num];
2697eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
270d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
274d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[N];
2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
2877eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.services.get(i).info.enabled) num++;
2887eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
2897eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.services = new ServiceInfo[num];
2907eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
291d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
295d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.services[j++] = generateServiceInfo(p.services.get(i), flags);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3037eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
3047eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[N];
3057eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                } else {
3067eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    int num = 0;
3077eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    for (int i=0; i<N; i++) {
3087eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                        if (p.providers.get(i).info.enabled) num++;
3097eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    }
3107eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                    pi.providers = new ProviderInfo[num];
3117eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn                }
312d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                for (int i=0, j=0; i<N; i++) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
316d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                        pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
348d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           int N = (p.mSignatures != null) ? p.mSignatures.length : 0;
349d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu           if (N > 0) {
350d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                pi.signatures = new Signature[N];
351d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
362d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Root            InputStream is = new BufferedInputStream(jarFile.getInputStream(je));
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
369d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Exception reading " + je.getName() + " in "
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
3716e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn        } catch (RuntimeException e) {
372d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Exception reading " + je.getName() + " in "
3736e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn                    + jarFile.getName(), e);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
378af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IS_SYSTEM = 1<<0;
379af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_CHATTY = 1<<1;
380af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_MUST_BE_APK = 1<<2;
381af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_IGNORE_PROCESSES = 1<<3;
382af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_FORWARD_LOCK = 1<<4;
383af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public final static int PARSE_ON_SDCARD = 1<<5;
384806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn    public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
390af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu    public Package parsePackage(File sourceFile, String destCodePath,
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
396d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
405d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Slog.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
411d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (DEBUG_JAR)
412d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.d(TAG, "Scanning package: " + mArchiveSourcePath);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
4163b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn        Resources res = null;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
420b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
4213b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn            if (cookie != 0) {
4223b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn                res = new Resources(assmgr, metrics, null);
42369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4243b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn                        Build.VERSION.RESOURCES_SDK_INT);
425bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
428d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Slog.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
431d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Unable to read AndroidManifest.xml of "
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4343b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn        if (assetError) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
452d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            // If we are only parsing core apps, then a null with INSTALL_SUCCEEDED
453d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            // just means to skip this app so don't make a fuss about it.
454d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            if (!mOnlyCoreApps || mParseError != PackageManager.INSTALL_SUCCEEDED) {
455d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                if (errorException != null) {
456d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                    Slog.w(TAG, mArchiveSourcePath, errorException);
457d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                } else {
458d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                    Slog.w(TAG, mArchiveSourcePath + " (at "
459d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                            + parser.getPositionDescription()
460d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                            + "): " + errorText[0]);
461d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                }
462d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
463d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
464d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
474af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        // Set code and resource paths
475af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mPath = destCodePath;
476af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        pkg.mScanPath = mArchiveSourcePath;
477af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.sourceDir = destCodePath;
478af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        //pkg.applicationInfo.publicSourceDir = destRes;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
511bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                JarEntry jarEntry = jarFile.getJarEntry(ANDROID_MANIFEST_FILENAME);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
514d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.e(TAG, "Package " + pkg.packageName
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.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                }
521d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                if (DEBUG_JAR) {
522d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
527d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                            Slog.i(TAG, "  Public key: "
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
534d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Enumeration<JarEntry> entries = jarFile.entries();
535bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                final Manifest manifest = jarFile.getManifest();
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
537d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    final JarEntry je = entries.nextElement();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
539d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root
540bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                    final String name = je.getName();
541bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
542bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                    if (name.startsWith("META-INF/"))
543bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                        continue;
544bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
545bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                    if (ANDROID_MANIFEST_FILENAME.equals(name)) {
546bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                        final Attributes attributes = manifest.getAttributes(name);
547bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                        pkg.manifestDigest = ManifestDigest.fromAttributes(attributes);
548bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                    }
549bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
550bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root                    final Certificate[] localCerts = loadCertificates(jarFile, je, readBuffer);
551d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    if (DEBUG_JAR) {
552d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
556bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
558d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.e(TAG, "Package " + pkg.packageName
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
578d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                                Slog.e(TAG, "Package " + pkg.packageName
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
603d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Slog.e(TAG, "Package " + pkg.packageName
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
609d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
613d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
617d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
625a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    /*
626a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * Utility method that retrieves just the package name and install
627a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * location from the apk location at the given file path.
628a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param packageFilePath file location of the apk
629a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     * @param flags Special parse flags
630930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root     * @return PackageLite object with package information or null on failure.
631a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu     */
632a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    public static PackageLite parsePackageLite(String packageFilePath, int flags) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
63405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final XmlResourceParser parser;
63505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final Resources res;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
63869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn            assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6393b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn                    Build.VERSION.RESOURCES_SDK_INT);
6401ebd74acf9977daa42133507e970dab88e08f0efKenny Root
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
6421ebd74acf9977daa42133507e970dab88e08f0efKenny Root            if (cookie == 0) {
6431ebd74acf9977daa42133507e970dab88e08f0efKenny Root                return null;
6441ebd74acf9977daa42133507e970dab88e08f0efKenny Root            }
6451ebd74acf9977daa42133507e970dab88e08f0efKenny Root
64605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final DisplayMetrics metrics = new DisplayMetrics();
64705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            metrics.setToDefaults();
64805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            res = new Resources(assmgr, metrics, null);
649bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root            parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
652d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, "Unable to read AndroidManifest.xml of "
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
65705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final AttributeSet attrs = parser;
65805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final String errors[] = new String[1];
659a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        PackageLite packageLite = null;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
66105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            packageLite = parsePackageLite(res, parser, attrs, flags, errors);
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
663d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, packageFilePath, e);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
665d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.w(TAG, packageFilePath, e);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
670a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (packageLite == null) {
671d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.e(TAG, "parsePackageLite error: " + errors[0]);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
674a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        return packageLite;
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
708d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        while ((type = parser.next()) != XmlPullParser.START_TAG
709d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                && type != XmlPullParser.END_DOCUMENT) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
713d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (type != XmlPullParser.START_TAG) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
717d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (DEBUG_PARSER)
718d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.v(TAG, "Root element name: '" + parser.getName() + "'");
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root    private static PackageLite parsePackageLite(Resources res, XmlPullParser parser,
73905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            AttributeSet attrs, int flags, String[] outError) throws IOException,
74005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            XmlPullParserException {
741a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
742a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        int type;
743d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        while ((type = parser.next()) != XmlPullParser.START_TAG
744d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                && type != XmlPullParser.END_DOCUMENT) {
745a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            ;
746a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
747a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
748d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (type != XmlPullParser.START_TAG) {
749a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No start tag found";
750a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
751a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
752d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (DEBUG_PARSER)
753d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.v(TAG, "Root element name: '" + parser.getName() + "'");
754a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (!parser.getName().equals("manifest")) {
755a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "No <manifest> tag";
756a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
757a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
758a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String pkgName = attrs.getAttributeValue(null, "package");
759a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (pkgName == null || pkgName.length() == 0) {
760a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> does not specify package";
761a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
762a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
763a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        String nameError = validateName(pkgName, true);
764a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        if (nameError != null && !"android".equals(pkgName)) {
765a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            outError[0] = "<manifest> specifies bad package name \""
766a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                + pkgName + "\": " + nameError;
767a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            return null;
768a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
76990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu        int installLocation = PARSE_DEFAULT_INSTALL_LOCATION;
770a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        for (int i = 0; i < attrs.getAttributeCount(); i++) {
771a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            String attr = attrs.getAttributeName(i);
772a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            if (attr.equals("installLocation")) {
773a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                installLocation = attrs.getAttributeIntValue(i,
77490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                        PARSE_DEFAULT_INSTALL_LOCATION);
775a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu                break;
776a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu            }
777a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu        }
77805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
77905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        // Only search the tree when the tag is directly below <manifest>
78005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final int searchDepth = parser.getDepth() + 1;
78105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
78205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final List<VerifierInfo> verifiers = new ArrayList<VerifierInfo>();
78305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
78405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() >= searchDepth)) {
78505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
78605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                continue;
78705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            }
78805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
78905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            if (parser.getDepth() == searchDepth && "package-verifier".equals(parser.getName())) {
79005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                final VerifierInfo verifier = parseVerifier(res, parser, attrs, flags, outError);
79105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                if (verifier != null) {
79205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                    verifiers.add(verifier);
79305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                }
79405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            }
79505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        }
79605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
79705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        return new PackageLite(pkgName.intern(), installLocation, verifiers);
798a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu    }
799a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
8181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
8191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
8201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
8211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn        if (mOnlyCoreApps) {
830d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            boolean core = attrs.getAttributeBooleanValue(null, "coreApp", false);
831d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            if (!core) {
832d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                mParseError = PackageManager.INSTALL_SUCCEEDED;
833d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn                return null;
834d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn            }
835d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn        }
836d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
839851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
844cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        pkg.mVersionName = sa.getNonConfigurationString(
845cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_versionName, 0);
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
849cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
850cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0);
851cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        if (str != null && str.length() > 0) {
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
864aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu
865117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        pkg.installLocation = sa.getInteger(
866117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu                com.android.internal.R.styleable.AndroidManifest_installLocation,
86790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu                PARSE_DEFAULT_INSTALL_LOCATION);
86854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        pkg.applicationInfo.installLocation = pkg.installLocation;
86954e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn
870723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        // Resource boolean are -1, so 1 means we don't know the value.
871723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsSmallScreens = 1;
872723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsNormalScreens = 1;
873723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        int supportsLargeScreens = 1;
87414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        int supportsXLargeScreens = 1;
875c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        int resizeable = 1;
87611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        int anyDensity = 1;
877723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
879d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
880d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
881d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
893d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "<manifest> has more than one <application>");
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
920cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
927854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    pkg.requestedPermissions.add(name.intern());
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
960d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu            } else if (tagName.equals("uses-feature")) {
96149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                FeatureInfo fi = new FeatureInfo();
962d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa = res.obtainAttributes(attrs,
963d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                        com.android.internal.R.styleable.AndroidManifestUsesFeature);
964cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
965cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
96649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                fi.name = sa.getNonResourceString(
96749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_name);
96849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
96949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.reqGlEsVersion = sa.getInt(
97049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion,
97149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            FeatureInfo.GL_ES_VERSION_UNDEFINED);
97249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
97349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (sa.getBoolean(
97449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesFeature_required,
97549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true)) {
97649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    fi.flags |= FeatureInfo.FLAG_REQUIRED;
97749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
978d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                sa.recycle();
97949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (pkg.reqFeatures == null) {
98049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.reqFeatures = new ArrayList<FeatureInfo>();
98149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
98249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                pkg.reqFeatures.add(fi);
98349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
98449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (fi.name == null) {
98549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    ConfigurationInfo cPref = new ConfigurationInfo();
98649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    cPref.reqGlEsVersion = fi.reqGlEsVersion;
98749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    pkg.configPreferences.add(cPref);
98849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                }
989d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
990d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu                XmlUtils.skipCurrentTag(parser);
991d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu
992851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
9938d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                if (SDK_VERSION > 0) {
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
997851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
998851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
999851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
1000851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
1001851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1002851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
1003851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
1004851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
1005851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
1006851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
1007851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
1008851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
10095c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            targetVers = minVers = val.data;
1010851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
1011851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
1012851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1013851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
1014851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
1015851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
1016851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
1017851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
1018851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
1019851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
1020851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
1021851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
1022851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
1023851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10265c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    if (minCode != null) {
10278d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!minCode.equals(SDK_CODENAME)) {
10288d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
10295c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
10308d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
10315c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            } else {
10325c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                outError[0] = "Requires development platform " + minCode
10335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                                        + " but this is a release platform.";
10345c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            }
10355c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
10365c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                            return null;
10375c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        }
10388d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                    } else if (minVers > SDK_VERSION) {
10395c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
10408d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                + " (current version is #" + SDK_VERSION + ")";
10415c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
10425c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                        return null;
10435c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn                    }
10445c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
1045851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
10468d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                        if (!targetCode.equals(SDK_CODENAME)) {
10478d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                            if (SDK_CODENAME != null) {
1048851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
10498d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu                                        + " (current platform is " + SDK_CODENAME + ")";
1050851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
1051851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
1052851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
1053851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
1054851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
1055851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
1056851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
1057851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
1058a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
1059a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
1060a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
1061a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
1062851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1067723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            } else if (tagName.equals("supports-screens")) {
1068723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa = res.obtainAttributes(attrs,
1069723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens);
1070723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
1071df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                pkg.applicationInfo.requiresSmallestWidthDp = sa.getInteger(
1072df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_requiresSmallestWidthDp,
1073df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                        0);
1074df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                pkg.applicationInfo.compatibleWidthLimitDp = sa.getInteger(
1075df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_compatibleWidthLimitDp,
1076df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn                        0);
10772762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn                pkg.applicationInfo.largestWidthLimitDp = sa.getInteger(
10782762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largestWidthLimitDp,
10792762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn                        0);
1080df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn
1081723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // This is a trick to get a boolean and still able to detect
1082723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                // if a value was actually set.
1083723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsSmallScreens = sa.getInteger(
1084723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens,
1085723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsSmallScreens);
1086723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsNormalScreens = sa.getInteger(
1087723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens,
1088723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsNormalScreens);
1089723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                supportsLargeScreens = sa.getInteger(
1090723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens,
1091723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                        supportsLargeScreens);
109214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                supportsXLargeScreens = sa.getInteger(
109314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens,
109414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        supportsXLargeScreens);
1095c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                resizeable = sa.getInteger(
1096c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable,
109714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        resizeable);
109811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                anyDensity = sa.getInteger(
109911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity,
110011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        anyDensity);
1101723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
1102723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                sa.recycle();
1103723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn
11049189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
1105854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1106854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("protected-broadcast")) {
1107854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa = res.obtainAttributes(attrs,
1108854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
1109854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1110cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1111cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
1112854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                String name = sa.getNonResourceString(
1113854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
1114854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1115854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                sa.recycle();
1116854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1117854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
1118854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (pkg.protectedBroadcasts == null) {
1119854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts = new ArrayList<String>();
1120854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1121854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    if (!pkg.protectedBroadcasts.contains(name)) {
1122854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                        pkg.protectedBroadcasts.add(name.intern());
1123854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    }
1124854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1125854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1126854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1127854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1128854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("instrumentation")) {
1129854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
1130854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    return null;
1131854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                }
1132854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1133b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("original-package")) {
1134b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1135b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1136b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1137cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String orig =sa.getNonConfigurationString(
1138cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
11396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (!pkg.packageName.equals(orig)) {
1140c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    if (pkg.mOriginalPackages == null) {
1141c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mOriginalPackages = new ArrayList<String>();
1142c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                        pkg.mRealPackage = pkg.packageName;
1143c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    }
1144c1552397be706c243338389c628a44eee6011eaeDianne Hackborn                    pkg.mOriginalPackages.add(orig);
11456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                }
1146b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1147b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1148b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1149b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1150b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1151b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn            } else if (tagName.equals("adopt-permissions")) {
1152b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa = res.obtainAttributes(attrs,
1153b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage);
1154b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1155cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String name = sa.getNonConfigurationString(
1156cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0);
1157b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1158b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                sa.recycle();
1159b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
11606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                if (name != null) {
1161b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    if (pkg.mAdoptPermissions == null) {
1162b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                        pkg.mAdoptPermissions = new ArrayList<String>();
1163b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    }
1164b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                    pkg.mAdoptPermissions.add(name);
1165b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                }
1166b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1167b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1168b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
1169a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn            } else if (tagName.equals("uses-gl-texture")) {
1170a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                // Just skip this tag
1171a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                XmlUtils.skipCurrentTag(parser);
1172a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                continue;
1173a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn
1174a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn            } else if (tagName.equals("compatible-screens")) {
1175a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                // Just skip this tag
1176a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                XmlUtils.skipCurrentTag(parser);
1177a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn                continue;
1178a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn
1179854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (tagName.equals("eat-comment")) {
1180854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                // Just skip this tag
1181854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1182854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                continue;
1183854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
1184854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn            } else if (RIGID_PARSER) {
1185854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                outError[0] = "Bad element under <manifest>: "
1186854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    + parser.getName();
1187854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
1188854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                return null;
1189854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1191d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Slog.w(TAG, "Unknown element under <manifest>: " + parser.getName()
1192bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + " at " + mArchiveSourcePath + " "
1193bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                        + parser.getPositionDescription());
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1204a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
1205a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        StringBuilder implicitPerms = null;
1206a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
1207a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
1208a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
1209a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
1210a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
1211a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1212a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
1213a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                if (implicitPerms == null) {
1214a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms = new StringBuilder(128);
1215a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(pkg.packageName);
1216a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(": compat added ");
1217a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                } else {
1218a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                    implicitPerms.append(' ');
1219a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
1220a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                implicitPerms.append(npi.name);
1221a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
1222a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
1223851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
1224a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        if (implicitPerms != null) {
1225d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.i(TAG, implicitPerms.toString());
1226a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn        }
1227851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
1228723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsSmallScreens < 0 || (supportsSmallScreens > 0
1229723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
123011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1231723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
1232723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1233723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsNormalScreens != 0) {
1234723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS;
1235723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
1236723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        if (supportsLargeScreens < 0 || (supportsLargeScreens > 0
1237723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
123811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1239723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
1240723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn        }
124114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0
124214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
124314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn                        >= android.os.Build.VERSION_CODES.GINGERBREAD)) {
124414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS;
124514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn        }
1246c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        if (resizeable < 0 || (resizeable > 0
1247c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
124811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
1249c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS;
1250c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn        }
125111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn        if (anyDensity < 0 || (anyDensity > 0
125211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                && pkg.applicationInfo.targetSdkVersion
125311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn                        >= android.os.Build.VERSION_CODES.DONUT)) {
125411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES;
12551ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima        }
12561ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1329d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        return buildCompoundName(pkg, procSeq, "process", outError);
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
135581cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon,
135681cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionGroup_logo)) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
139181cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermission_icon,
139281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermission_logo)) {
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1398cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1399cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
144581cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon,
144681cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestPermissionTree_logo)) {
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
14871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
14881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
14891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
149081cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon,
149181cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestInstrumentation_logo);
14921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
14931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
14941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
14961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
14981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
14991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1506cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // Note: don't allow this value to be a reference to a resource
1507cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        // that may change.
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1548cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
1549cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_name, 0);
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String manageSpaceActivity = sa.getNonConfigurationString(
1560cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0);
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1566181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1567181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1568181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1569181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
15705e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
15713de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant
15723de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate            // if backup is possible for the given application.
1573cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String backupAgent = sa.getNonConfigurationString(
1574cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0);
1575181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1576181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1577d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                if (DEBUG_BACKUP) {
1578d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.v(TAG, "android:backupAgent = " + ai.backupAgentName
1579a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " from " + pkgName + "+" + backupAgent);
1580a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                }
15815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate
15825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
15835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore,
15845e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                        true)) {
15855e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE;
15865e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                }
15875e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate                if (sa.getBoolean(
15883dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion,
15893dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                        false)) {
15903dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                    ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
15913dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate                }
1592181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1593181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
15944a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
160381cd2e90ccdda498234384c8207afe2213714e60Adam Powell        ai.logo = sa.getResourceId(
160481cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestApplication_logo, 0);
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
1606b35cd54b88292bd6cf0387406ad9071f5475c6a7Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1618af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_FORWARD_LOCK) != 0) {
1619af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
1620af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1621af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
1622af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        if ((flags & PARSE_ON_SDCARD) != 0) {
16236069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu            ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
1624af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu        }
1625af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
1633ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng                com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode,
163423085b781e145ed684e7270af1d5ced6800b8effBen Cheng                false)) {
163523085b781e145ed684e7270af1d5ced6800b8effBen Cheng            ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE;
163623085b781e145ed684e7270af1d5ced6800b8effBen Cheng        }
163723085b781e145ed684e7270af1d5ced6800b8effBen Cheng
1638529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy        boolean hardwareAccelerated = sa.getBoolean(
1639812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy                com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated,
16402d6833bab353e31ceb4230f3f3563fca2e0d9f6fDianne Hackborn                owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH);
1641812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy
1642812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy        if (sa.getBoolean(
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1660ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1661ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1662e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1663ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1664ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1665ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
1666a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks        if (sa.getBoolean(
16673b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_largeHeap,
1668a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks                false)) {
16693b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_LARGE_HEAP;
1670a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks        }
1671a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1673cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1674cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_permission, 0);
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1677d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1678d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonConfigurationString(
1679d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0);
1680d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        } else {
1681d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // Some older apps have been seen to use a resource reference
1682d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // here that on older builds was ignored (with a warning).  We
1683d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            // need to continue to do this for them so they don't break.
1684d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            str = sa.getNonResourceString(
1685d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
1686d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn        }
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
1691d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            CharSequence pname;
1692d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
1693d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonConfigurationString(
1694d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process, 0);
1695d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            } else {
1696d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // Some older apps have been seen to use a resource reference
1697d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // here that on older builds was ignored (with a warning).  We
1698d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                // need to continue to do this for them so they don't break.
1699d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                pname = sa.getNonResourceString(
1700d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_process);
1701d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            }
1702d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn            ai.processName = buildProcessName(ai.packageName, null, pname,
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1705cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            ai.enabled = sa.getBoolean(
1706cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
1707860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
170802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn            if (false) {
170902486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                if (sa.getBoolean(
171002486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestApplication_cantSaveState,
171102486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        false)) {
171254e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn                    ai.flags |= ApplicationInfo.FLAG_CANT_SAVE_STATE;
171302486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn
171402486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    // A heavy-weight application can not be in a custom process.
171502486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    // We can do direct compare because we intern all strings.
171602486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    if (ai.processName != null && ai.processName != ai.packageName) {
171702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                        outError[0] = "cantSaveState applications can not use custom processes";
171802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn                    }
1719860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                }
1720860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1723269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        ai.uiOptions = sa.getInt(
1724269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell                com.android.internal.R.styleable.AndroidManifestApplication_uiOptions, 0);
1725269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
1736d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1737d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
1738d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
1744529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false,
1745529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                        hardwareAccelerated);
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
1754529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false);
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
17811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1803cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // Note: don't allow this value to be a reference to a resource
1804cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                // that may change.
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
180749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                boolean req = sa.getBoolean(
180849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_required,
180949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        true);
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
181349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                if (lname != null) {
181449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    if (req) {
181549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesLibraries == null) {
181649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries = new ArrayList<String>();
181749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
181849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesLibraries.contains(lname)) {
181949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesLibraries.add(lname.intern());
182049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
182149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    } else {
182249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (owner.usesOptionalLibraries == null) {
182349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries = new ArrayList<String>();
182449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
182549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        if (!owner.usesOptionalLibraries.contains(lname)) {
182649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                            owner.usesOptionalLibraries.add(lname.intern());
182749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                        }
182849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn                    }
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1833cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn            } else if (tagName.equals("uses-package")) {
1834cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                // Dependencies for app installers; we don't currently try to
1835cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                // enforce this.
1836cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
1837cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
1840d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Unknown element under <application>: " + tagName
1841a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
1842a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
185881cd2e90ccdda498234384c8207afe2213714e60Adam Powell            int nameRes, int labelRes, int iconRes, int logoRes) {
1859cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(nameRes, 0);
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
187681cd2e90ccdda498234384c8207afe2213714e60Adam Powell
187781cd2e90ccdda498234384c8207afe2213714e60Adam Powell        int logoVal = sa.getResourceId(logoRes, 0);
187881cd2e90ccdda498234384c8207afe2213714e60Adam Powell        if (logoVal != 0) {
187981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            outInfo.logo = logoVal;
188081cd2e90ccdda498234384c8207afe2213714e60Adam Powell        }
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
1894529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            boolean receiver, boolean hardwareAccelerated)
1895529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            throws XmlPullParserException, IOException {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
19001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
19011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
19021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
19031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
190481cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestActivity_logo,
19051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
19078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_description,
19081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
19091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
19121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
19131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
19141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
19161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1931269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        a.info.uiOptions = sa.getInt(
1932269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell                com.android.internal.R.styleable.AndroidManifestActivity_uiOptions,
1933269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell                a.info.applicationInfo.uiOptions);
1934269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
1936cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1937cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_permission, 0);
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1944cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
1945cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0);
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1998ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        if (sa.getBoolean(
1999ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs,
2000ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn                false)) {
2001ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
2002ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn        }
2003ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
2004613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler        if (sa.getBoolean(
2005613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler                com.android.internal.R.styleable.AndroidManifestActivity_immersive,
2006613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler                false)) {
2007613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler            a.info.flags |= ActivityInfo.FLAG_IMMERSIVE;
2008613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler        }
2009529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
2011529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            if (sa.getBoolean(
2012529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                    com.android.internal.R.styleable.AndroidManifestActivity_hardwareAccelerated,
2013529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                    hardwareAccelerated)) {
2014529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy                a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED;
2015529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy            }
2016529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
203654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
2037860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have receives in its main process
2038860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2039860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (a.info.processName == owner.packageName) {
2040860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have receivers in main process";
2041860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2042860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2043860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
2063d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "No actions in intent filter at "
2064bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
2065bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2076d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
2078d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "Unknown element under <receiver>: " + parser.getName()
2079a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
2080a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
2082d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "Unknown element under <activity>: " + parser.getName()
2083a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + " at " + mArchiveSourcePath + " "
2084a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
2089d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    if (receiver) {
2090d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        outError[0] = "Bad element under <receiver>: " + parser.getName();
2091d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    } else {
2092d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        outError[0] = "Bad element under <activity>: " + parser.getName();
2093d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    }
2094d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    return null;
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
21071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
21081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2112cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String targetActivity = sa.getNonConfigurationString(
2113cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0);
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
21281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
21291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
21301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
21311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
213281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestActivityAlias_logo,
21331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
21341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
21358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_description,
21361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
21381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
21391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
21411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
21421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
21621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
21631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
21641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
21651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
216681cd2e90ccdda498234384c8207afe2213714e60Adam Powell        info.logo = target.info.logo;
21671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
21681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
21691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
21701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
21718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        if (info.descriptionRes == 0) {
21728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            info.descriptionRes = target.info.descriptionRes;
21738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn        }
21741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
21751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
21761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
21770836c7cb98dd3ff1ef0379dcb97be8b315fed7ebDianne Hackborn        info.softInputMode = target.info.softInputMode;
2178269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell        info.uiOptions = target.info.uiOptions;
21791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
21801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
21811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
2194cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2195cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0);
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
2221d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "No actions in intent filter at "
2222bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + mArchiveSourcePath + " "
2223bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn                            + parser.getPositionDescription());
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2234d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()
2235a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + " at " + mArchiveSourcePath + " "
2236a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
2239d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                } else {
2240d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    outError[0] = "Bad element under <activity-alias>: " + parser.getName();
2241d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    return null;
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
22601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
22611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
22621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
22631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
226481cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestProvider_logo,
22651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
22661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
22678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_description,
22681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
22691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
22701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
22711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
22721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
22731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
22741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
22751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
22761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2284cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String cpname = sa.getNonConfigurationString(
2285cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0);
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2291cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String permission = sa.getNonConfigurationString(
2292cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_permission, 0);
2293cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2294cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0);
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2304cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        str = sa.getNonConfigurationString(
2305cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0);
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
233054e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
2331860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have providers in its main process
2332860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2333860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (p.info.processName == owner.packageName) {
2334860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have providers in main process";
2335860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2336860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2337860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2338860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2377cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2378cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0);
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2383cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2384cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0);
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2389cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2390cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0);
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
24092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
24102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2411d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "Unknown element under <path-permission>: "
2412a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2413a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
24142af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
24152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
2416d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    } else {
2417d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
2418d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        return false;
24192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
24202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                XmlUtils.skipCurrentTag(parser);
24222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn            } else if (parser.getName().equals("path-permission")) {
24242af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                TypedArray sa = res.obtainAttributes(attrs,
24252af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission);
24262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                PathPermission pa = null;
24282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2429cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String permission = sa.getNonConfigurationString(
2430cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0);
2431cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String readPermission = sa.getNonConfigurationString(
2432cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0);
24332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission == null) {
24342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = permission;
24352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
2436cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String writePermission = sa.getNonConfigurationString(
2437cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0);
24382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission == null) {
24392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    writePermission = permission;
24402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24412af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24422af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                boolean havePerm = false;
24432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (readPermission != null) {
24442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    readPermission = readPermission.intern();
24452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
24462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (writePermission != null) {
2448e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert                    writePermission = writePermission.intern();
24492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    havePerm = true;
24502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (!havePerm) {
24532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2454d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "No readPermission or writePermssion for <path-permission>: "
2455a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2456a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
24572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
24582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
2459d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    } else {
2460d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        outError[0] = "No readPermission or writePermssion for <path-permission>";
2461d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        return false;
24622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
24632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2465cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String path = sa.getNonConfigurationString(
2466cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0);
24672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
24682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
24692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
24702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2472cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2473cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0);
24742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
24752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
24762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
24772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
2479cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                path = sa.getNonConfigurationString(
2480cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0);
24812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (path != null) {
24822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    pa = new PathPermission(path,
24832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
24842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                }
24852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                sa.recycle();
24872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn
24882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                if (pa != null) {
24892af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (outInfo.info.pathPermissions == null) {
24902af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = new PathPermission[1];
24912af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions[0] = pa;
24922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    } else {
24932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        final int N = outInfo.info.pathPermissions.length;
24942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        PathPermission[] newp = new PathPermission[N+1];
24952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
24962af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        newp[N] = pa;
24972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        outInfo.info.pathPermissions = newp;
24982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
24992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                } else {
25002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    if (!RIGID_PARSER) {
2501d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: "
2502a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2503a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
25042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        XmlUtils.skipCurrentTag(parser);
25052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                        continue;
25062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    }
25072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
25082af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn                    return false;
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2514d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Unknown element under <provider>: "
2515a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2516a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
2519d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                } else {
2520d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    outError[0] = "Bad element under <provider>: " + parser.getName();
2521d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    return false;
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
25351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
25361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
25371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
25381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
253981cd2e90ccdda498234384c8207afe2213714e60Adam Powell                    com.android.internal.R.styleable.AndroidManifestService_logo,
25401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
25411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
25428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_description,
25431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
25441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
25451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
25461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
25481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
25491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
25511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2563cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String str = sa.getNonConfigurationString(
2564cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestService_permission, 0);
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        s.info.flags = 0;
25720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (sa.getBoolean(
25730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                com.android.internal.R.styleable.AndroidManifestService_stopWithTask,
25740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn                false)) {
25750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn            s.info.flags |= ServiceInfo.FLAG_STOP_WITH_TASK;
25760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        }
25770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
258054e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn        if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
2581860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // A heavy-weight application can not have services in its main process
2582860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            // We can do direct compare because we intern all strings.
2583860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            if (s.info.processName == owner.packageName) {
2584860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                outError[0] = "Heavy-weight applications can not have services in main process";
2585860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn                return null;
2586860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn            }
2587860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn        }
2588860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2612d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Unknown element under <service>: "
2613a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
2617d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                } else {
2618d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    outError[0] = "Bad element under <service>: " + parser.getName();
2619d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    return null;
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
2651d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    Slog.w(TAG, "Unknown element under " + tag + ": "
2652a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getName() + " at " + mArchiveSourcePath + " "
2653a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                            + parser.getPositionDescription());
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
2656d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                } else {
2657d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    outError[0] = "Bad element under " + tag + ": " + parser.getName();
2658d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    return false;
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2677cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn        String name = sa.getNonConfigurationString(
2678cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestMetaData_name, 0);
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2685854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        name = name.intern();
2686854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
2690d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            //Slog.i(TAG, "Meta data ref " + name + ": " + v);
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
2695d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            //Slog.i(TAG, "Meta data " + name + ": " + v);
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
2699854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn                    data.putString(name, cs != null ? cs.toString().intern() : null);
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
2709d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                        Slog.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: "
2710a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getName() + " at " + mArchiveSourcePath + " "
2711a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                                + parser.getPositionDescription());
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
273005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root    private static VerifierInfo parseVerifier(Resources res, XmlPullParser parser,
273105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException,
273205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            IOException {
273305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final TypedArray sa = res.obtainAttributes(attrs,
273405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                com.android.internal.R.styleable.AndroidManifestPackageVerifier);
273505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
273605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final String packageName = sa.getNonResourceString(
273705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                com.android.internal.R.styleable.AndroidManifestPackageVerifier_name);
273805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
273905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        final String encodedPublicKey = sa.getNonResourceString(
274005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root                com.android.internal.R.styleable.AndroidManifestPackageVerifier_publicKey);
274105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
274205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        sa.recycle();
274305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
274405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        if (packageName == null || packageName.length() == 0) {
274505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            Slog.i(TAG, "verifier package name was null; skipping");
274605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return null;
274705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } else if (encodedPublicKey == null) {
274805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            Slog.i(TAG, "verifier " + packageName + " public key was null; skipping");
274905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        }
275005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
275105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        EncodedKeySpec keySpec;
275205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        try {
275305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT);
275405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            keySpec = new X509EncodedKeySpec(encoded);
275505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } catch (IllegalArgumentException e) {
275605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            Slog.i(TAG, "Could not parse verifier " + packageName + " public key; invalid Base64");
275705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return null;
275805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        }
275905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
276005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        /* First try the key as an RSA key. */
276105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        try {
276205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
276305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final PublicKey publicKey = keyFactory.generatePublic(keySpec);
276405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return new VerifierInfo(packageName, publicKey);
276505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } catch (NoSuchAlgorithmException e) {
276605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            Log.wtf(TAG, "Could not parse public key because RSA isn't included in build");
276705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return null;
276805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } catch (InvalidKeySpecException e) {
276905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            // Not a RSA public key.
277005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        }
277105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
277205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        /* Now try it as a DSA key. */
277305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        try {
277405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final KeyFactory keyFactory = KeyFactory.getInstance("DSA");
277505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            final PublicKey publicKey = keyFactory.generatePublic(keySpec);
277605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return new VerifierInfo(packageName, publicKey);
277705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } catch (NoSuchAlgorithmException e) {
277805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            Log.wtf(TAG, "Could not parse public key because DSA isn't included in build");
277905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            return null;
278005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        } catch (InvalidKeySpecException e) {
278105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root            // Not a DSA public key.
278205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        }
278305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
278405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root        return null;
278505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root    }
278605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
2801502e9a47c64d819a7aa45251bcf7cb5dd77a310bKenny Root
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
281081cd2e90ccdda498234384c8207afe2213714e60Adam Powell
281181cd2e90ccdda498234384c8207afe2213714e60Adam Powell        outInfo.logo = sa.getResourceId(
281281cd2e90ccdda498234384c8207afe2213714e60Adam Powell                com.android.internal.R.styleable.AndroidManifestIntentFilter_logo, 0);
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
2818d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2819d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2820d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2850cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String str = sa.getNonConfigurationString(
2851cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_mimeType, 0);
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2862cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2863cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_scheme, 0);
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2868cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String host = sa.getNonConfigurationString(
2869cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_host, 0);
2870cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                String port = sa.getNonConfigurationString(
2871cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_port, 0);
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2876cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2877cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_path, 0);
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2882cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2883cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0);
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2888cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                str = sa.getNonConfigurationString(
2889cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn                        com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0);
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
2897d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                Slog.w(TAG, "Unknown element under <intent-filter>: "
2898a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getName() + " at " + mArchiveSourcePath + " "
2899a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn                        + parser.getPositionDescription());
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
2908d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root
2909d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root        if (DEBUG_PARSER) {
2910d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            final StringBuilder cats = new StringBuilder("Intent d=");
2911d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            cats.append(outInfo.hasDefault);
2912d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            cats.append(", cat=");
2913d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root
2914d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            final Iterator<String> it = outInfo.categoriesIterator();
2915d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            if (it != null) {
2916d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                while (it.hasNext()) {
2917d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    cats.append(' ');
2918d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                    cats.append(it.next());
2919d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root                }
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2921d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root            Slog.d(TAG, cats.toString());
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
29286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String packageName;
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2943854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn        public ArrayList<String> protectedBroadcasts;
2944854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn
294549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesLibraries = null;
294649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<String> usesOptionalLibraries = null;
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949c1552397be706c243338389c628a44eee6011eaeDianne Hackborn        public ArrayList<String> mOriginalPackages = null;
29506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String mRealPackage = null;
2951b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn        public ArrayList<String> mAdoptPermissions = null;
2952b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by the package manager to keep track of the path to the
29795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // file an app came from.
29805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public String mScanPath;
29815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
29825c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        // For use by package manager to keep track of where it has done dexopt.
29835c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn        public boolean mDidDexOpt;
29845c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn
298546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        // User set enabled state.
298646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
298746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn
2988e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        // Whether the package has been stopped.
2989e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        public boolean mSetStopped = false;
2990e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
2993deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root
2994deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root        // Whether an operation is currently pending on this package
2995deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root        public boolean mOperationPending;
2996deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
300349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        /*
300449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         *  Applications requested features
300549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn         */
300649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn        public ArrayList<FeatureInfo> reqFeatures = null;
300749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn
3008117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu        public int installLocation;
3009117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
3010bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root        /**
3011bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root         * Digest suitable for comparing whether this package's manifest is the
3012bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root         * same as another.
3013bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root         */
3014bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root        public ManifestDigest manifestDigest;
3015bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String newName) {
30236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            packageName = newName;
30246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            applicationInfo.packageName = newName;
30256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissions.size()-1; i>=0; i--) {
30266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissions.get(i).setPackageName(newName);
30276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=permissionGroups.size()-1; i>=0; i--) {
30296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                permissionGroups.get(i).setPackageName(newName);
30306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=activities.size()-1; i>=0; i--) {
30326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                activities.get(i).setPackageName(newName);
30336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=receivers.size()-1; i>=0; i--) {
30356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                receivers.get(i).setPackageName(newName);
30366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=providers.size()-1; i>=0; i--) {
30386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                providers.get(i).setPackageName(newName);
30396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=services.size()-1; i>=0; i--) {
30416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                services.get(i).setPackageName(newName);
30426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            for (int i=instrumentation.size()-1; i>=0; i--) {
30446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                instrumentation.get(i).setPackageName(newName);
30456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
30466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
30476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
30571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
30586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public final String className;
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        ComponentName componentName;
30626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        String componentShortName;
30636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
30661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
30676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = null;
30681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
30691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
30711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
30721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
3073cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn            String name = args.sa.getNonConfigurationString(args.nameRes, 0);
30741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
30756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
30761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
30771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
30781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
30791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
30811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
30821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
30836dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                className = null;
30841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
30851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
30861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
30871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = outInfo.name;
30891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
30901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
30911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
30921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
30931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
30941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
309581cd2e90ccdda498234384c8207afe2213714e60Adam Powell
309681cd2e90ccdda498234384c8207afe2213714e60Adam Powell            int logoVal = args.sa.getResourceId(args.logoRes, 0);
309781cd2e90ccdda498234384c8207afe2213714e60Adam Powell            if (logoVal != 0) {
309881cd2e90ccdda498234384c8207afe2213714e60Adam Powell                outInfo.logo = logoVal;
309981cd2e90ccdda498234384c8207afe2213714e60Adam Powell            }
31001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
31021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
31031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
31041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
31051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
31081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
31111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
31121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
31131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
31141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
31151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
3116d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                CharSequence pname;
3117d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
3118d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonConfigurationString(args.processRes, 0);
3119d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                } else {
3120d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // Some older apps have been seen to use a resource reference
3121d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // here that on older builds was ignored (with a warning).  We
3122d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    // need to continue to do this for them so they don't break.
3123d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                    pname = args.sa.getNonResourceString(args.processRes);
3124d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                }
31251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
3126d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn                        owner.applicationInfo.processName, pname,
31271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
31281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
31298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
31308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            if (args.descriptionRes != 0) {
31318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn                outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0);
31328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn            }
31338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn
31341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
31391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
31406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            className = clone.className;
31416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = clone.componentName;
31421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
31436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public ComponentName getComponentName() {
31466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentName != null) {
31476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentName;
31486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
31496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (className != null) {
31506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentName = new ComponentName(owner.applicationInfo.packageName,
31516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                        className);
31526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
31536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentName;
31546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public String getComponentShortName() {
31576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (componentShortName != null) {
31586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                return componentShortName;
31596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
31606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            ComponentName component = getComponentName();
31616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            if (component != null) {
31626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                componentShortName = component.flattenToShortString();
31636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            }
31646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            return componentShortName;
31656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentName = null;
31696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            componentShortName = null;
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
31886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
31896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
31906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
31916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
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 "PermissionGroup{"
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
322646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
322746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
322846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            if (p.applicationInfo.enabled != enabled) {
322946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn                return true;
323046730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn            }
323146730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn        }
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
324669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // CompatibilityMode is global state. It's safe to modify the instance
324769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            // of the package.
324869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            if (!sCompatibilityModeEnabled) {
324969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima                p.applicationInfo.disableCompatibilityMode();
325069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            }
3251e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            if (p.mSetStopped) {
3252e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn                p.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
3253e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            } else {
3254e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn                p.applicationInfo.flags &= ~ApplicationInfo.FLAG_STOPPED;
3255e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            }
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
326769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        if (!sCompatibilityModeEnabled) {
326869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima            ai.disableCompatibilityMode();
326969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        }
3270e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        if (p.mSetStopped) {
3271e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            p.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED;
3272e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        } else {
3273e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn            p.applicationInfo.flags &= ~ApplicationInfo.FLAG_STOPPED;
3274e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn        }
32754b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck        if (p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
32764b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck            ai.enabled = true;
32770ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn        } else if (p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
32780ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn                || p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
32794b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck            ai.enabled = false;
32804b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck        }
32810ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn        ai.enabledSetting = p.mSetEnabled;
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
33081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
33111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
33121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
33131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
33166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
33176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
33186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
33196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
33206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
33246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
33421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
33451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
33461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
33471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
33506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
33516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
33526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
33536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
33546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
33586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
33791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
33801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
33811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
33926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
33936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
33946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
33956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
34221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
34251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
34261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
34296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        public void setPackageName(String packageName) {
34306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            super.setPackageName(packageName);
34316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn            info.packageName = packageName;
34326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn        }
34336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
34376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn                + " " + getComponentShortName() + "}";
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
345781cd2e90ccdda498234384c8207afe2213714e60Adam Powell        public int logo;
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
348769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima
348869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    /**
348969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     * @hide
349069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima     */
349169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
349269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima        sCompatibilityModeEnabled = compatibilityModeEnabled;
349369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima    }
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3495