PackageParser.java revision 9189cabb0b6c6c28232fe6f412b7ba7a37352a6a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.XmlUtils;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
488d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser {
58a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /** @hide */
59a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    public static class NewPermissionInfo {
60a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final String name;
61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int sdkVersion;
62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public final int fileVersion;
63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        public NewPermissionInfo(String name, int sdkVersion, int fileVersion) {
65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.name = name;
66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.sdkVersion = sdkVersion;
67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            this.fileVersion = fileVersion;
68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        }
69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    }
70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn
71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    /**
72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * List of new permissions that have been added since 1.0.
73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * NOTE: These must be declared in SDK version order, with permissions
74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * added to older SDKs appearing before those added to newer SDKs.
75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     * @hide
76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn     */
7745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh    public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
7845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh        new PackageParser.NewPermissionInfo[] {
795a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat            new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0),
8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh            new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
8245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh                    android.os.Build.VERSION_CODES.DONUT, 0)
83a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn    };
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mArchiveSourcePath;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mSeparateProcesses;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mSdkVersion;
88851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    private String mSdkCodename;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mParseError = PackageManager.INSTALL_SUCCEEDED;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final Object mSync = new Object();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static WeakReference<byte[]> mReadBuffer;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParsePackageItemArgs {
961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final Package owner;
971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] outError;
981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int nameRes;
991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int labelRes;
1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int iconRes;
1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        String tag;
1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        TypedArray sa;
1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParsePackageItemArgs(Package _owner, String[] _outError,
1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes) {
1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = _owner;
1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outError = _outError;
1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            nameRes = _nameRes;
1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            labelRes = _labelRes;
1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            iconRes = _iconRes;
1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    static class ParseComponentArgs extends ParsePackageItemArgs {
1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final String[] sepProcesses;
1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int processRes;
1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        final int enabledRes;
1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        int flags;
1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ParseComponentArgs(Package _owner, String[] _outError,
1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                int _nameRes, int _labelRes, int _iconRes,
1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                String[] _sepProcesses, int _processRes,int _enabledRes) {
1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(_owner, _outError, _nameRes, _labelRes, _iconRes);
1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            sepProcesses = _sepProcesses;
1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            processRes = _processRes;
1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            enabledRes = _enabledRes;
1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    }
1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParsePackageItemArgs mParseInstrumentationArgs;
1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityArgs;
1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseActivityAliasArgs;
1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseServiceArgs;
1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    private ParseComponentArgs mParseProviderArgs;
1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** If set to true, we will only allow package files that exactly match
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  the DTD.  Otherwise, we try to get as much from the package as we
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  can without failing.  This should normally be set to false, to
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  support extensions to the DTD in future versions. */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean RIGID_PARSER = false;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PackageParser";
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PackageParser(String archiveSourcePath) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = archiveSourcePath;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSeparateProcesses(String[] procs) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSeparateProcesses = procs;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn    public void setSdkVersion(int sdkVersion, String codename) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSdkVersion = sdkVersion;
155851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        mSdkCodename = codename;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean isPackageFilename(String name) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return name.endsWith(".apk");
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate and return the {@link PackageInfo} for a parsed package.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param p the parsed package.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags indicating which optional information is included.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static PackageInfo generatePackageInfo(PackageParser.Package p,
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int gids[], int flags) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PackageInfo pi = new PackageInfo();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.packageName = p.packageName;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionCode = p.mVersionCode;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.versionName = p.mVersionName;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserId = p.mSharedUserId;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.sharedUserLabel = p.mSharedUserLabel;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = p.applicationInfo;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_GIDS) != 0) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.gids = gids;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.configPreferences.size();
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.configPreferences = new ConfigurationInfo[N];
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.configPreferences[i] = p.configPreferences.get(i);
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_ACTIVITIES) != 0) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.activities.size();
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.activities = new ActivityInfo[N];
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.activities.get(i);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.activities[i] = generateActivityInfo(p.activities.get(i), flags);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_RECEIVERS) != 0) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.receivers.size();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.receivers = new ActivityInfo[N];
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Activity activity = p.receivers.get(i);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (activity.info.enabled
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.receivers[i] = generateActivityInfo(p.receivers.get(i), flags);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SERVICES) != 0) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.services.size();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.services = new ServiceInfo[N];
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Service service = p.services.get(i);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (service.info.enabled
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.services[i] = generateServiceInfo(p.services.get(i), flags);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PROVIDERS) != 0) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.providers.size();
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.providers = new ProviderInfo[N];
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final Provider provider = p.providers.get(i);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (provider.info.enabled
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pi.providers[i] = generateProviderInfo(p.providers.get(i), flags);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.instrumentation.size();
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.instrumentation = new InstrumentationInfo[N];
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.instrumentation[i] = generateInstrumentationInfo(
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            p.instrumentation.get(i), flags);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_PERMISSIONS) != 0) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.permissions.size();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.permissions = new PermissionInfo[N];
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            N = p.requestedPermissions.size();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.requestedPermissions = new String[N];
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pi.requestedPermissions[i] = p.requestedPermissions.get(i);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_SIGNATURES) != 0) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = p.mSignatures.length;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (N > 0) {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pi.signatures = new Signature[N];
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N);
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Certificate[] loadCertificates(JarFile jarFile, JarEntry je,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] readBuffer) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We must read the stream for the JarEntry to retrieve
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // its certificates.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            InputStream is = jarFile.getInputStream(je);
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (is.read(readBuffer, 0, readBuffer.length) != -1) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // not using
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is.close();
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return je != null ? je.getCertificates() : null;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + je.getName() + " in "
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + jarFile.getName(), e);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IS_SYSTEM = 0x0001;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_CHATTY = 0x0002;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_MUST_BE_APK = 0x0004;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int PARSE_IGNORE_PROCESSES = 0x0008;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getParseError() {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParseError;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Package parsePackage(File sourceFile, String destFileName,
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisplayMetrics metrics, int flags) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mParseError = PackageManager.INSTALL_SUCCEEDED;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArchiveSourcePath = sourceFile.getPath();
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!sourceFile.isFile()) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Skipping dir: " + mArchiveSourcePath);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isPackageFilename(sourceFile.getName())
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (flags&PARSE_MUST_BE_APK) != 0) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) == 0) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We expect to have non-.apk files in the system dir,
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // so don't warn about them.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d(
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Scanning package: " + mArchiveSourcePath);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean assetError = true;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
334b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            int cookie = assmgr.addAssetPath(mArchiveSourcePath);
335b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if(cookie != 0) {
336b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assetError = false;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + mArchiveSourcePath, e);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(assetError) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] errorText = new String[1];
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package pkg = null;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Exception errorException = null;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXXX todo: need to figure out correct configuration.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Resources res = new Resources(assmgr, metrics, null);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg = parsePackage(res, parser, flags, errorText);
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            errorException = e;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (errorException != null) {
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath, errorException);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, mArchiveSourcePath + " (at "
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + parser.getPositionDescription()
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + "): " + errorText[0]);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser.close();
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr.close();
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParseError == PackageManager.INSTALL_SUCCEEDED) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        parser.close();
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assmgr.close();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.sourceDir = destFileName;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.applicationInfo.publicSourceDir = destFileName;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean collectCertificates(Package pkg, int flags) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mSignatures = null;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WeakReference<byte[]> readBufferRef;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] readBuffer = null;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mSync) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readBufferRef = mReadBuffer;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBufferRef != null) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = null;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = readBufferRef.get();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (readBuffer == null) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBuffer = new byte[8192];
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                readBufferRef = new WeakReference<byte[]>(readBuffer);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            JarFile jarFile = new JarFile(mArchiveSourcePath);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Certificate[] certs = null;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((flags&PARSE_IS_SYSTEM) != 0) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If this package comes from the system image, then we
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // can trust it...  we'll just use the AndroidManifest.xml
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // to retrieve its signatures, not validating all of the
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // files.
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                certs = loadCertificates(jarFile, jarEntry, readBuffer);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (certs == null) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Package " + pkg.packageName
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " has no certificates at entry "
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + jarEntry.getName() + "; ignoring!");
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    jarFile.close();
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (false) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " certs=" + (certs != null ? certs.length : 0));
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (certs != null) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = certs.length;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<N; i++) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.i(TAG, "  Public key: "
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + certs[i].getPublicKey().getEncoded()
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + " " + certs[i].getPublicKey());
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Enumeration entries = jarFile.entries();
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (entries.hasMoreElements()) {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    JarEntry je = (JarEntry)entries.nextElement();
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.isDirectory()) continue;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (je.getName().startsWith("META-INF/")) continue;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Certificate[] localCerts = loadCertificates(jarFile, je,
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            readBuffer);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (false) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName()
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + ": certs=" + certs + " ("
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + (certs != null ? certs.length : 0) + ")");
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (localCerts == null) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Package " + pkg.packageName
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " has no certificates at entry "
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + je.getName() + "; ignoring!");
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        jarFile.close();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (certs == null) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        certs = localCerts;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Ensure all certificates match.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (int i=0; i<certs.length; i++) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            boolean found = false;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            for (int j=0; j<localCerts.length; j++) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (certs[i] != null &&
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        certs[i].equals(localCerts[j])) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    found = true;
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    break;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!found || certs.length != localCerts.length) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                Log.e(TAG, "Package " + pkg.packageName
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + " has mismatched certificates at entry "
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + je.getName() + "; ignoring!");
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jarFile.close();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                return false;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jarFile.close();
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mSync) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mReadBuffer = readBufferRef;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (certs != null && certs.length > 0) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int N = certs.length;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.mSignatures = new Signature[certs.length];
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<N; i++) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.mSignatures[i] = new Signature(
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            certs[i].getEncoded());
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "Package " + pkg.packageName
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " has no certificates; ignoring!");
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CertificateEncodingException e) {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Exception reading " + mArchiveSourcePath, e);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String parsePackageName(String packageFilePath, int flags) {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlResourceParser parser = null;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AssetManager assmgr = null;
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assmgr = new AssetManager();
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int cookie = assmgr.addAssetPath(packageFilePath);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml");
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Unable to read AndroidManifest.xml of "
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + packageFilePath, e);
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String errors[] = new String[1];
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String packageName = null;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = parsePackageName(parser, attrs, flags, errors);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (XmlPullParserException e) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, packageFilePath, e);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser != null) parser.close();
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (assmgr != null) assmgr.close();
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (packageName == null) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(TAG, "parsePackageName error: " + errors[0]);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return packageName;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String validateName(String name, boolean requiresSeparator) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = name.length();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasSep = false;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean front = true;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final char c = name.charAt(i);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = false;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!front) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((c >= '0' && c <= '9') || c == '_') {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (c == '.') {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hasSep = true;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                front = true;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "bad character '" + c + "'";
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return hasSep || !requiresSeparator
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? null : "must have at least one '.' separator";
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String parsePackageName(XmlPullParser parser,
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AttributeSet attrs, int flags, String[] outError)
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.START_TAG
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   && type != parser.END_DOCUMENT) {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type != parser.START_TAG) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No start tag found";
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v(
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TAG, "Root element name: '" + parser.getName() + "'");
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parser.getName().equals("manifest")) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "No <manifest> tag";
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = attrs.getAttributeValue(null, "package");
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null || pkgName.length() == 0) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not specify package";
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(pkgName, true);
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"android".equals(pkgName)) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> specifies bad package name \""
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + pkgName + "\": " + nameError;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkgName.intern();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary.
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public Signature stringToSignature(String str) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = str.length();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] sig = new byte[N];
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sig[i] = (byte)str.charAt(i);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Signature(sig);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Package parsePackage(
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res, XmlResourceParser parser, int flags, String[] outError)
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttributeSet attrs = parser;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs = null;
6321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs = null;
6331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs = null;
6341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs = null;
6351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkgName = parsePackageName(parser, attrs, flags, outError);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkgName == null) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Package pkg = new Package(pkgName);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean foundApp = false;
645851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionCode = sa.getInteger(
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pkg.mVersionName = sa.getNonResourceString(
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_versionName);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.mVersionName != null) {
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mVersionName = pkg.mVersionName.intern();
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifest_sharedUserId);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(str, true);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null && !"android".equals(pkgName)) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<manifest> specifies bad sharedUserId name \""
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + str + "\": " + nameError;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserId = str.intern();
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.mSharedUserLabel = sa.getResourceId(
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0);
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("application")) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (foundApp) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (RIGID_PARSER) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<manifest> has more than one <application>";
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<manifest> has more than one <application>");
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        XmlUtils.skipCurrentTag(parser);
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        continue;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                foundApp = true;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseApplication(pkg, res, parser, attrs, flags, outError)) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-group")) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission")) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermission(pkg, res, parser, attrs, outError) == null) {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("permission-tree")) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-permission")) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission);
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String name = sa.getNonResourceString(
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name != null && !pkg.requestedPermissions.contains(name)) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pkg.requestedPermissions.add(name);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-configuration")) {
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ConfigurationInfo cPref = new ConfigurationInfo();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqTouchScreen = sa.getInt(
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen,
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.TOUCHSCREEN_UNDEFINED);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqKeyboardType = sa.getInt(
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType,
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.KEYBOARD_UNDEFINED);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard,
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cPref.reqNavigation = sa.getInt(
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation,
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Configuration.NAVIGATION_UNDEFINED);
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sa.getBoolean(
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav,
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        false)) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.configPreferences.add(cPref);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
751851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn            } else if (tagName.equals("uses-sdk")) {
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mSdkVersion > 0) {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa = res.obtainAttributes(attrs,
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.styleable.AndroidManifestUsesSdk);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int minVers = 0;
757851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String minCode = null;
758851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int targetVers = 0;
759851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    String targetCode = null;
760851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
761851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    TypedValue val = sa.peekValue(
762851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion);
763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
764851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
765851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
766851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
767851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
768851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            minVers = val.data;
769851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
770851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
771851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
772851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    val = sa.peekValue(
773851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion);
774851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (val != null) {
775851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (val.type == TypedValue.TYPE_STRING && val.string != null) {
776851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetCode = minCode = val.string.toString();
777851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        } else {
778851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            // If it's not a string, it's an integer.
779851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            targetVers = val.data;
780851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
781851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
782851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
783851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    int maxVers = sa.getInt(
784851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            com.android.internal.R.styleable.AndroidManifestUsesSdk_maxSdkVersion,
785851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mSdkVersion);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sa.recycle();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (targetCode != null) {
790851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        if (!targetCode.equals(mSdkCodename)) {
791851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            if (mSdkCodename != null) {
792851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
793851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " (current platform is " + mSdkCodename + ")";
794851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            } else {
795851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                outError[0] = "Requires development platform " + targetCode
796851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                        + " but this is a release platform.";
797851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            }
798851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
799851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                            return null;
800851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        }
801851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        // If the code matches, it definitely targets this SDK.
802a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion
803a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                                = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
804a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    } else {
805a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        pkg.applicationInfo.targetSdkVersion = targetVers;
806851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
807851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
808851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (minVers > mSdkVersion) {
809851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        outError[0] = "Requires newer sdk version #" + minVers
810851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
811851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
812851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        return null;
813851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    }
814851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
815851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                    if (maxVers < mSdkVersion) {
816851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                        outError[0] = "Requires older sdk version #" + maxVers
817851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn                                + " (current version is #" + mSdkVersion + ")";
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK;
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return null;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("instrumentation")) {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("eat-comment")) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Just skip this tag
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (RIGID_PARSER) {
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <manifest>: "
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
8389189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8399189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8409189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima            } else if (tagName.equals("supports-density")) {
8419189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                sa = res.obtainAttributes(attrs,
8429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                        com.android.internal.R.styleable.AndroidManifestSupportsDensity);
8439189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8449189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                int density = sa.getInteger(
8459189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                        com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1);
8469189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8479189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                sa.recycle();
8489189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8499189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                if (density != -1 && !pkg.supportsDensityList.contains(density)) {
8509189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                    pkg.supportsDensityList.add(density);
8519189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                }
8529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
8549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima            } else if (tagName.equals("expandable")) {
8569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                pkg.expandable = true;
8579189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                XmlUtils.skipCurrentTag(parser);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Bad element under <manifest>: "
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      + parser.getName());
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!foundApp && pkg.instrumentation.size() == 0) {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<manifest> does not contain an <application> or <instrumentation>";
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
871a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        final int NP = PackageParser.NEW_PERMISSIONS.length;
872a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn        for (int ip=0; ip<NP; ip++) {
873a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            final PackageParser.NewPermissionInfo npi
874a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                    = PackageParser.NEW_PERMISSIONS[ip];
875a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) {
876a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                break;
877a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
878a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            if (!pkg.requestedPermissions.contains(npi.name)) {
879a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg "
880a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                        + pkg.packageName);
881a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn                pkg.requestedPermissions.add(npi.name);
882a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn            }
883851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn        }
884851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg.usesLibraries.size() > 0) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.usesLibraryFiles = new String[pkg.usesLibraries.size()];
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pkg.usesLibraries.toArray(pkg.usesLibraryFiles);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8899189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        // TODO: enable all density & expandable if target sdk is higher than donut
8909189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
8918d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        int size = pkg.supportsDensityList.size();
8928d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if (size > 0) {
8938d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            int densities[] = pkg.supportsDensities = new int[size];
8948d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            List<Integer> densityList = pkg.supportsDensityList;
8958d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            for (int i = 0; i < size; i++) {
8968d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima                densities[i] = densityList.get(i);
8978d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            }
8988d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pkg;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildClassName(String pkg, CharSequence clsSeq,
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clsSeq == null || clsSeq.length() <= 0) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Empty class name in package " + pkg;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cls = clsSeq.toString();
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = cls.charAt(0);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c == '.') {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + cls).intern();
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cls.indexOf('.') < 0) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder b = new StringBuilder(pkg);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append('.');
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            b.append(cls);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return b.toString().intern();
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (c >= 'a' && c <= 'z') {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cls.intern();
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outError[0] = "Bad class name " + cls + " in package " + pkg;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildCompoundName(String pkg,
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String type, String[] outError) {
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String proc = procSeq.toString();
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char c = proc.charAt(0);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg != null && c == ':') {
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (proc.length() < 2) {
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad " + type + " name " + proc + " in package " + pkg
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": must be at least two characters";
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String subName = proc.substring(1);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nameError = validateName(subName, false);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nameError != null) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Invalid " + type + " name " + proc + " in package "
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + pkg + ": " + nameError;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (pkg + proc).intern();
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String nameError = validateName(proc, true);
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nameError != null && !"system".equals(proc)) {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "Invalid " + type + " name " + proc + " in package "
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + pkg + ": " + nameError;
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return proc.intern();
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildProcessName(String pkg, String defProc,
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, int flags, String[] separateProcesses,
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc != null ? defProc : pkg;
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (separateProcesses != null) {
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=separateProcesses.length-1; i>=0; i--) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String sp = separateProcesses[i];
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return pkg;
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null || procSeq.length() <= 0) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "package", outError);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String buildTaskAffinityName(String pkg, String defProc,
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence procSeq, String[] outError) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq == null) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return defProc;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (procSeq.length() <= 0) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buildCompoundName(pkg, procSeq, "taskAffinity", outError);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PermissionGroup parsePermissionGroup(Package owner, Resources res,
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroup perm = new PermissionGroup(owner);
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-group>", sa,
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_name,
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_label,
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionGroup_description,
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm,
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissionGroups.add(perm);
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermission(Package owner, Resources res,
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission>", sa,
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_name,
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_label,
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_icon)) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.group = sa.getNonResourceString(
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup);
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.group != null) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            perm.info.group = perm.info.group.intern();
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = sa.getResourceId(
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_description,
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = sa.getInt(
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel,
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo.PROTECTION_NORMAL);
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (perm.info.protectionLevel == -1) {
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission> does not specify protectionLevel";
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission>", perm,
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Permission parsePermissionTree(Package owner, Resources res,
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Permission perm = new Permission(owner);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree);
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, perm.info, outError,
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "<permission-tree>", sa,
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_name,
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_label,
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int index = perm.info.name.indexOf('.');
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index > 0) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            index = perm.info.name.indexOf('.', index+1);
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<permission-tree> name has less than three segments: "
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + perm.info.name;
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.descriptionRes = 0;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        perm.tree = true;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm,
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.permissions.add(perm);
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return perm;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Instrumentation parseInstrumentation(Package owner, Resources res,
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String[] outError)
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation);
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseInstrumentationArgs == null) {
11241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError,
11251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_name,
11261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_label,
11271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestInstrumentation_icon);
11281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseInstrumentationArgs.tag = "<instrumentation>";
11291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
11301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
11311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseInstrumentationArgs.sa = sa;
11321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
11331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Instrumentation a = new Instrumentation(mParseInstrumentationArgs,
11341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                new InstrumentationInfo());
11351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.targetPackage = str != null ? str.intern() : null;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.handleProfiling = sa.getBoolean(
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling,
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.functionalTest = sa.getBoolean(
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest,
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a.info.targetPackage == null) {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<instrumentation> does not specify targetPackage";
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a,
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError)) {
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        owner.instrumentation.add(a);
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseApplication(Package owner, Resources res,
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        throws XmlPullParserException, IOException {
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ApplicationInfo ai = owner.applicationInfo;
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String pkgName = owner.applicationInfo.packageName;
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication);
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_name);
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name != null) {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.className = buildClassName(pkgName, name, outError);
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.className == null) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String manageSpaceActivity = sa.getNonResourceString(
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity);
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (manageSpaceActivity != null) {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity,
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1200181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        boolean allowBackup = sa.getBoolean(
1201181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true);
1202181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        if (allowBackup) {
1203181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
1204181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            String backupAgent = sa.getNonResourceString(
1205181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                    com.android.internal.R.styleable.AndroidManifestApplication_backupAgent);
1206181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            if (backupAgent != null) {
1207181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                ai.backupAgentName = buildClassName(pkgName, backupAgent, outError);
1208181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                Log.v(TAG, "android:backupAgent = " + ai.backupAgentName
1209181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate                        + " from " + pkgName + "+" + backupAgent);
1210181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate            }
1211181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate        }
1212181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_label);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (ai.labelRes=v.resourceId) == 0) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.nonLocalizedLabel = v.coerceToString();
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.icon = sa.getResourceId(
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_icon, 0);
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.theme = sa.getResourceId(
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_theme, 0);
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.descriptionRes = sa.getResourceId(
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_description, 0);
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PARSE_IS_SYSTEM) != 0) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (sa.getBoolean(
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_persistent,
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    false)) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.flags |= ApplicationInfo.FLAG_PERSISTENT;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_hasCode,
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_HAS_CODE;
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting,
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData,
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                true)) {
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1258ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        if (sa.getBoolean(
1259ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                com.android.internal.R.styleable.AndroidManifestApplication_testOnly,
1260e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn                false)) {
1261ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            ai.flags |= ApplicationInfo.FLAG_TEST_ONLY;
1262ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn        }
1263ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_permission);
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.permission = (str != null && str.length() > 0) ? str.intern() : null;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName,
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str, outError);
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] == null) {
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.processName = buildProcessName(ai.packageName, null, sa.getNonResourceString(
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestApplication_process),
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.enabled = sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_enabled, true);
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int innerDepth = parser.getDepth();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > innerDepth)) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String tagName = parser.getName();
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tagName.equals("activity")) {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false);
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("receiver")) {
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.receivers.add(a);
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("service")) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Service s = parseService(owner, res, parser, attrs, flags, outError);
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (s == null) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.services.add(s);
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("provider")) {
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Provider p = parseProvider(owner, res, parser, attrs, flags, outError);
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (p == null) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.providers.add(p);
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("activity-alias")) {
13361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (a == null) {
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.activities.add(a);
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // note: application meta-data is stored off to the side, so it can
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remain null in the primary copy (we like to avoid extra copies because
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // it can be large)
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData,
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (tagName.equals("uses-library")) {
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary);
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String lname = sa.getNonResourceString(
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestUsesLibrary_name);
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (lname != null && !owner.usesLibraries.contains(lname)) {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    owner.usesLibraries.add(lname);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <application>: " + tagName);
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <application>: " + tagName;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo,
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] outError, String tag, TypedArray sa,
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes) {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(nameRes);
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = tag + " does not specify android:name";
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.name
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = buildClassName(owner.applicationInfo.packageName, name, outError);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outInfo.name == null) {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconVal = sa.getResourceId(iconRes, 0);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconVal != 0) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.icon = iconVal;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = null;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(labelRes);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.packageName = owner.packageName;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseComponentInfo(Package owner, int flags,
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComponentInfo outInfo, String[] outError, String tag, TypedArray sa,
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int nameRes, int labelRes, int iconRes, int processRes,
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int enabledRes) {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parsePackageItemInfo(owner, outInfo, outError, tag, sa,
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nameRes, labelRes, iconRes)) {
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (processRes != 0) {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    owner.applicationInfo.processName, sa.getNonResourceString(processRes),
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    flags, mSeparateProcesses, outError);
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.enabled = sa.getBoolean(enabledRes, true);
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return outError[0] == null;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivity(Package owner, Resources res,
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError,
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean receiver) throws XmlPullParserException, IOException {
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity);
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityArgs == null) {
14431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityArgs = new ParseComponentArgs(owner, outError,
14441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_name,
14451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_label,
14461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_icon,
14471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
14481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_process,
14491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivity_enabled);
14501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
14511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>";
14531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.sa = sa;
14541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityArgs.flags = flags;
14551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
14561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityArgs, new ActivityInfo());
14571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_exported);
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_exported, false);
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.theme = sa.getResourceId(
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_theme, 0);
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_permission);
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = owner.applicationInfo.permission;
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity);
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName,
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                owner.applicationInfo.taskAffinity, str, outError);
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.info.flags = 0;
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_multiprocess,
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS;
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch,
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH;
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch,
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_noHistory,
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_NO_HISTORY;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState,
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded,
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED;
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents,
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false)) {
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sa.getBoolean(
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting,
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) {
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING;
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!receiver) {
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = sa.getInt(
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_launchMode,
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.LAUNCH_MULTIPLE);
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.screenOrientation = sa.getInt(
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation,
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = sa.getInt(
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_configChanges,
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.softInputMode = sa.getInt(
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode,
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    0);
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.configChanges = 0;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) {
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Intent filter for activity " + intent
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " defines no actions");
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (receiver) {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Unknown element under <receiver>: " + parser.getName());
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Unknown element under <activity>: " + parser.getName());
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver) {
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <receiver>: " + parser.getName();
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "Bad element under <activity>: " + parser.getName();
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Activity parseActivityAlias(Package owner, Resources res,
16121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
16131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            throws XmlPullParserException, IOException {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias);
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String targetActivity = sa.getNonResourceString(
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity);
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> does not specify android:targetActivity";
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        targetActivity = buildClassName(owner.applicationInfo.packageName,
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                targetActivity, outError);
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (targetActivity == null) {
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseActivityAliasArgs == null) {
16331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs = new ParseComponentArgs(owner, outError,
16341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_name,
16351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_label,
16361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_icon,
16371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
16381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    0,
16391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled);
16401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseActivityAliasArgs.tag = "<activity-alias>";
16411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
16421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.sa = sa;
16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseActivityAliasArgs.flags = flags;
16451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Activity target = null;
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NA = owner.activities.size();
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<NA; i++) {
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Activity t = owner.activities.get(i);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (targetActivity.equals(t.info.name)) {
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                target = t;
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (target == null) {
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<activity-alias> target activity " + targetActivity
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " not found in manifest";
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        ActivityInfo info = new ActivityInfo();
16651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.targetActivity = targetActivity;
16661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.configChanges = target.info.configChanges;
16671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.flags = target.info.flags;
16681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.icon = target.info.icon;
16691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.labelRes = target.info.labelRes;
16701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.nonLocalizedLabel = target.info.nonLocalizedLabel;
16711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.launchMode = target.info.launchMode;
16721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.processName = target.info.processName;
16731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.screenOrientation = target.info.screenOrientation;
16741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.taskAffinity = target.info.taskAffinity;
16751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        info.theme = target.info.theme;
16761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
16771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Activity a = new Activity(mParseActivityAliasArgs, info);
16781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_exported);
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = sa.getBoolean(
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false);
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str;
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestActivityAlias_permission);
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str != null) {
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.permission = str.length() > 0 ? str.toString().intern() : null;
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outError[0] != null) {
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ActivityIntentInfo intent = new ActivityIntentInfo(a);
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) {
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (intent.countActions() == 0) {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Intent filter for activity alias " + intent
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " defines no actions");
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    a.intents.add(intent);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData,
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName());
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <activity-alias>: " + parser.getName();
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            a.info.exported = a.intents.size() > 0;
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return a;
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Provider parseProvider(Package owner, Resources res,
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider);
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseProviderArgs == null) {
17541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs = new ParseComponentArgs(owner, outError,
17551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_name,
17561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_label,
17571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_icon,
17581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
17591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_process,
17601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestProvider_enabled);
17611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseProviderArgs.tag = "<provider>";
17621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
17631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.sa = sa;
17651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseProviderArgs.flags = flags;
17661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
17671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Provider p = new Provider(mParseProviderArgs, new ProviderInfo());
17681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.exported = sa.getBoolean(
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_exported, true);
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String cpname = sa.getNonResourceString(
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_authorities);
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.isSyncable = sa.getBoolean(
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_syncable,
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String permission = sa.getNonResourceString(
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_permission);
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_readPermission);
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission = owner.applicationInfo.permission;
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.readPermission =
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str = sa.getNonResourceString(
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_writePermission);
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str = permission;
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission = owner.applicationInfo.permission;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            p.info.writePermission =
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str.length() > 0 ? str.toString().intern() : null;
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.grantUriPermissions = sa.getBoolean(
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions,
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.multiprocess = sa.getBoolean(
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_multiprocess,
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.initOrder = sa.getInt(
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestProvider_initOrder,
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0);
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cpname == null) {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<provider> does not incude authorities attribute";
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        p.info.authority = cpname.intern();
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!parseProviderTags(res, parser, attrs, p, outError)) {
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return p;
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseProviderTags(Resources res,
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Provider outInfo, String[] outError)
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("grant-uri-permission")) {
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TypedArray sa = res.obtainAttributes(attrs,
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PatternMatcher pa = null;
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path);
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL);
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix);
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX);
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern);
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pa != null) {
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (outInfo.info.uriPermissionPatterns == null) {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = new PatternMatcher[1];
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns[0] = pa;
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final int N = outInfo.info.uriPermissionPatterns.length;
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PatternMatcher[] newp = new PatternMatcher[N+1];
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N);
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        newp[N] = pa;
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.info.uriPermissionPatterns = newp;
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.info.grantUriPermissions = true;
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <provider>: "
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <provider>: "
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Service parseService(Package owner, Resources res,
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService);
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (mParseServiceArgs == null) {
19171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs = new ParseComponentArgs(owner, outError,
19181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_name,
19191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_label,
19201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_icon,
19211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    mSeparateProcesses,
19221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_process,
19231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    com.android.internal.R.styleable.AndroidManifestService_enabled);
19241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mParseServiceArgs.tag = "<service>";
19251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
19261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.sa = sa;
19281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        mParseServiceArgs.flags = flags;
19291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        Service s = new Service(mParseServiceArgs, new ServiceInfo());
19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (outError[0] != null) {
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean setExported = sa.hasValue(
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_exported);
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (setExported) {
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = sa.getBoolean(
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestService_exported, false);
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String str = sa.getNonResourceString(
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestService_permission);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == null) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = owner.applicationInfo.permission;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.permission = str.length() > 0 ? str.toString().intern() : null;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("intent-filter")) {
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ServiceIntentInfo intent = new ServiceIntentInfo(s);
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) {
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s.intents.add(intent);
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (parser.getName().equals("meta-data")) {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData,
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError)) == null) {
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under <service>: "
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <service>: "
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setExported) {
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.info.exported = s.intents.size() > 0;
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return s;
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseAllMetaData(Resources res,
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, String tag,
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Component outInfo, String[] outError)
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != XmlPullParser.END_TAG
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       || parser.getDepth() > outerDepth)) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parser.getName().equals("meta-data")) {
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((outInfo.metaData=parseMetaData(res, parser, attrs,
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.metaData, outError)) == null) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!RIGID_PARSER) {
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.w(TAG, "Unknown element under " + tag + ": "
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + parser.getName());
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    XmlUtils.skipCurrentTag(parser);
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under " + tag + ": "
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getName();
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Bundle parseMetaData(Resources res,
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs,
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bundle data, String[] outError)
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = new Bundle();
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = sa.getNonResourceString(
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_name);
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name == null) {
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outError[0] = "<meta-data> requires an android:name attribute";
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sa.recycle();
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = true;
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestMetaData_resource);
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && v.resourceId != 0) {
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data ref " + name + ": " + v);
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.putInt(name, v.resourceId);
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v = sa.peekValue(
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.styleable.AndroidManifestMetaData_value);
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i(TAG, "Meta data " + name + ": " + v);
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (v.type == TypedValue.TYPE_STRING) {
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CharSequence cs = v.coerceToString();
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putString(name, cs != null ? cs.toString() : null);
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putBoolean(name, v.data != 0);
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type >= TypedValue.TYPE_FIRST_INT
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && v.type <= TypedValue.TYPE_LAST_INT) {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putInt(name, v.data);
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (v.type == TypedValue.TYPE_FLOAT) {
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    data.putFloat(name, v.getFloat());
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!RIGID_PARSER) {
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types");
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types";
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        data = null;
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "<meta-data> requires an android:value or android:resource attribute";
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = null;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlUtils.skipCurrentTag(parser);
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String ANDROID_RESOURCES
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = "http://schemas.android.com/apk/res/android";
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean parseIntent(Resources res,
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XmlPullParser parser, AttributeSet attrs, int flags,
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IntentInfo outInfo, String[] outError, boolean isActivity)
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws XmlPullParserException, IOException {
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray sa = res.obtainAttributes(attrs,
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter);
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int priority = sa.getInt(
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0);
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) {
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Activity with priority > 0, forcing to 0 at "
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + parser.getPositionDescription());
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            priority = 0;
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.setPriority(priority);
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue v = sa.peekValue(
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_label);
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outInfo.nonLocalizedLabel = v.coerceToString();
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.icon = sa.getResourceId(
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0);
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sa.recycle();
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int outerDepth = parser.getDepth();
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int type;
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((type=parser.next()) != parser.END_DOCUMENT
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               && (type != parser.END_TAG || parser.getDepth() > outerDepth)) {
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (type == parser.END_TAG || type == parser.TEXT) {
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String nodeName = parser.getName();
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeName.equals("action")) {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addAction(value);
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("category")) {
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = attrs.getAttributeValue(
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ANDROID_RESOURCES, "name");
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (value == null || value == "") {
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outError[0] = "No value supplied for <android:name>";
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return false;
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outInfo.addCategory(value);
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (nodeName.equals("data")) {
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa = res.obtainAttributes(attrs,
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData);
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String str = sa.getNonResourceString(
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_mimeType);
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outInfo.addDataType(str);
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IntentFilter.MalformedMimeTypeException e) {
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        outError[0] = e.toString();
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        sa.recycle();
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return false;
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_scheme);
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataScheme(str);
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String host = sa.getNonResourceString(
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_host);
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String port = sa.getNonResourceString(
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_port);
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (host != null) {
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataAuthority(host, port);
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_path);
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPrefix);
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX);
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                str = sa.getNonResourceString(
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        com.android.internal.R.styleable.AndroidManifestData_pathPattern);
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (str != null) {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sa.recycle();
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!RIGID_PARSER) {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "Unknown element under <intent-filter>: " + parser.getName());
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XmlUtils.skipCurrentTag(parser);
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                outError[0] = "Bad element under <intent-filter>: " + parser.getName();
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT);
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String cats = "";
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<String> it = outInfo.categoriesIterator();
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (it != null && it.hasNext()) {
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cats += " " + it.next();
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Intent d=" +
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outInfo.hasDefault + ", cat=" + cats);
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Package {
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final String packageName;
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For now we only support one application per package.
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ApplicationInfo applicationInfo = new ApplicationInfo();
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> activities = new ArrayList<Activity>(0);
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Service> services = new ArrayList<Service>(0);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> requestedPermissions = new ArrayList<String>();
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<String> usesLibraries = new ArrayList<String>();
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String[] usesLibraryFiles = null;
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We store the application meta-data independently to avoid multiple unwanted references
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle mAppMetaData = null;
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22508d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>();
22518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        public int[] supportsDensities = null;
22528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima
22539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        // If the application's window is expandable.
22549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        public boolean expandable;
22559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If this is a 3rd party app, this is the path of the zip file.
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mPath;
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version code declared for this package.
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mVersionCode;
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The version name declared for this package.
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mVersionName;
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user id that this package wants to use.
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String mSharedUserId;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The shared user label that this package wants to use.
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mSharedUserLabel;
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Signatures that were read from the package.
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Signature mSignatures[];
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // For use by package manager service for quick lookup of
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // preferred up order.
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int mPreferredOrder = 0;
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Additional data supplied by callers.
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Object mExtras;
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  Applications hardware preferences
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ArrayList<ConfigurationInfo> configPreferences =
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new ArrayList<ConfigurationInfo>();
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Package(String _name) {
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            packageName = _name;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.packageName = _name;
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            applicationInfo.uid = -1;
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Package{"
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + packageName + "}";
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Component<II extends IntentInfo> {
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Package owner;
23021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ArrayList<II> intents;
23031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ComponentName component;
23041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final String componentShortName;
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Bundle metaData;
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Package _owner) {
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = _owner;
23091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = null;
23101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = null;
23111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = null;
23121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
23131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) {
23151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            owner = args.owner;
23161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = new ArrayList<II>(0);
23171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            String name = args.sa.getNonResourceString(args.nameRes);
23181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (name == null) {
23191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not specify android:name";
23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.name
23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                = buildClassName(owner.applicationInfo.packageName, name, args.outError);
23271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (outInfo.name == null) {
23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                component = null;
23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                componentShortName = null;
23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                args.outError[0] = args.tag + " does not have valid android:name";
23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = new ComponentName(owner.applicationInfo.packageName,
23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                    outInfo.name);
23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = component.flattenToShortString();
23371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            int iconVal = args.sa.getResourceId(args.iconRes, 0);
23391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (iconVal != 0) {
23401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.icon = iconVal;
23411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = null;
23421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            TypedValue v = args.sa.peekValue(args.labelRes);
23451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (v != null && (outInfo.labelRes=v.resourceId) == 0) {
23461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.nonLocalizedLabel = v.coerceToString();
23471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.packageName = owner.packageName;
23501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
23511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Component(final ParseComponentArgs args, final ComponentInfo outInfo) {
23531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            this(args, (PackageItemInfo)outInfo);
23541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.outError[0] != null) {
23551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                return;
23561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
23581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            if (args.processRes != 0) {
23591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                outInfo.processName = buildProcessName(owner.applicationInfo.packageName,
23601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes),
23611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                        args.flags, args.sepProcesses, args.outError);
23621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
23631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            outInfo.enabled = args.sa.getBoolean(args.enabledRes, true);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Component(Component<II> clone) {
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            owner = clone.owner;
23681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            intents = clone.intents;
23691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            component = clone.component;
23701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            componentShortName = clone.componentShortName;
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            metaData = clone.metaData;
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Permission extends Component<IntentInfo> {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionInfo info;
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean tree;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup group;
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionInfo();
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Permission(Package _owner, PermissionInfo _info) {
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Permission{"
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class PermissionGroup extends Component<IntentInfo> {
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final PermissionGroupInfo info;
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner) {
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = new PermissionGroupInfo();
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public PermissionGroup(Package _owner, PermissionGroupInfo _info) {
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(_owner);
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info = _info;
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "PermissionGroup{"
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static boolean copyNeeded(int flags, Package p, Bundle metaData) {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (metaData != null || p.mAppMetaData != null)) {
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && p.usesLibraryFiles != null) {
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24268d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0
24279189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima                && p.supportsDensities != null) {
24289189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima            return true;
24299189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
24309189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        if ((flags & PackageManager.GET_EXPANDABLE) != 0) {
24318d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            return true;
24328d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p, null)) {
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.applicationInfo;
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copy so we can store the metadata/libraries safely
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ApplicationInfo ai = new ApplicationInfo(p.applicationInfo);
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_META_DATA) != 0) {
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.metaData = p.mAppMetaData;
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) {
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.sharedLibraryFiles = p.usesLibraryFiles;
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24508d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
24518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima            ai.supportsDensities = p.supportsDensities;
24528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima        }
24539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        if ((flags & PackageManager.GET_EXPANDABLE) != 0) {
24549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima            ai.expandable = p.expandable;
24559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima        }
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionInfo generatePermissionInfo(
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Permission p, int flags) {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionInfo pi = new PermissionInfo(p.info);
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final PermissionGroupInfo generatePermissionGroupInfo(
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PermissionGroup pg, int flags) {
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pg == null) return null;
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return pg.info;
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info);
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pgi.metaData = pg.metaData;
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pgi;
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Activity extends Component<ActivityIntentInfo> {
24821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ActivityInfo info;
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Activity(final ParseComponentArgs args, final ActivityInfo _info) {
24851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
24861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
24871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Activity{"
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ActivityInfo generateActivityInfo(Activity a,
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (a == null) return null;
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, a.owner, a.metaData)) {
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return a.info;
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ActivityInfo ai = new ActivityInfo(a.info);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.metaData = a.metaData;
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ai.applicationInfo = generateApplicationInfo(a.owner, flags);
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ai;
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Service extends Component<ServiceIntentInfo> {
25111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final ServiceInfo info;
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Service(final ParseComponentArgs args, final ServiceInfo _info) {
25141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
25151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
25161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Service{"
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ServiceInfo generateServiceInfo(Service s, int flags) {
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (s == null) return null;
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, s.owner, s.metaData)) {
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return s.info;
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceInfo si = new ServiceInfo(s.info);
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.metaData = s.metaData;
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        si.applicationInfo = generateApplicationInfo(s.owner, flags);
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return si;
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Provider extends Component {
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final ProviderInfo info;
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean syncable;
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Provider(final ParseComponentArgs args, final ProviderInfo _info) {
25431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
25441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
25451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info.applicationInfo = args.owner.applicationInfo;
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            syncable = false;
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Provider(Provider existingProvider) {
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(existingProvider);
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.info = existingProvider.info;
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this.syncable = existingProvider.syncable;
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Provider{"
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + info.name + "}";
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final ProviderInfo generateProviderInfo(Provider p,
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (p == null) return null;
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!copyNeeded(flags, p.owner, p.metaData)
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        || p.info.uriPermissionPatterns == null)) {
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return p.info;
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Make shallow copies so we can store the metadata safely
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ProviderInfo pi = new ProviderInfo(p.info);
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.metaData = p.metaData;
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) {
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pi.uriPermissionPatterns = null;
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pi.applicationInfo = generateApplicationInfo(p.owner, flags);
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return pi;
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class Instrumentation extends Component {
25811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public final InstrumentationInfo info;
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) {
25841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            super(args, _info);
25851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            info = _info;
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "Instrumentation{"
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + component.flattenToString() + "}";
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final InstrumentationInfo generateInstrumentationInfo(
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Instrumentation i, int flags) {
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i == null) return null;
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&PackageManager.GET_META_DATA) == 0) {
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return i.info;
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InstrumentationInfo ii = new InstrumentationInfo(i.info);
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ii.metaData = i.metaData;
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ii;
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class IntentInfo extends IntentFilter {
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean hasDefault;
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int labelRes;
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public CharSequence nonLocalizedLabel;
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int icon;
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ActivityIntentInfo extends IntentInfo {
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Activity activity;
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ActivityIntentInfo(Activity _activity) {
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            activity = _activity;
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ActivityIntentInfo{"
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + activity.info.name + "}";
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static class ServiceIntentInfo extends IntentInfo {
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Service service;
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ServiceIntentInfo(Service _service) {
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            service = _service;
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return "ServiceIntentInfo{"
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + Integer.toHexString(System.identityHashCode(this))
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + " " + service.info.name + "}";
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2641