Settings.java revision 62539e9efa02c4037d3310a8b4f16f0085cd8c37
1cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/*
2cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Copyright (C) 2011 The Android Open Source Project
3cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
4cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * you may not use this file except in compliance with the License.
6cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * You may obtain a copy of the License at
7cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
8cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
10cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Unless required by applicable law or agreed to in writing, software
11cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * See the License for the specific language governing permissions and
14cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * limitations under the License.
15cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
16cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
17cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpackage com.android.server.pm;
18cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
19cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
210ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackbornimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
22cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
23cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.FastXmlSerializer;
25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.JournaledFile;
26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.XmlUtils;
27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.server.IntentResolver;
28447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport com.android.server.pm.PackageManagerService.DumpState;
29cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParser;
31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParserException;
32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlSerializer;
33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
34447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName;
35447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent;
36cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo;
37cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo;
38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager;
39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser;
40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo;
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature;
420aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity;
43447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder;
44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment;
45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils;
46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process;
47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log;
48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog;
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray;
50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml;
51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream;
53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream;
55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream;
56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException;
57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter;
58447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat;
59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList;
60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays;
61447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date;
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap;
63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator;
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
6662539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils;
6762539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root
68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings.
70cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
71cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings {
72447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final String TAG = "PackageSettings";
73447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
74447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final boolean DEBUG_STOPPED = false;
75447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mSettingsFilename;
77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupSettingsFilename;
78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mPackageListFilename;
79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mStoppedPackagesFilename;
80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupStoppedPackagesFilename;
81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mPackages =
82cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, PackageSetting>();
83cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // List of replaced system applications
84cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mDisabledSysPackages =
85cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        new HashMap<String, PackageSetting>();
86cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // These are the last platform API version we were using for
88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // the apps installed on internal and external storage.  It is
89cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // used to grant newer permissions one time during a system upgrade.
90cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mInternalSdkPlatform;
91cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mExternalSdkPlatform;
920aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
930aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    /** Device identity for the purpose of package verification. */
940aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    private VerifierDeviceIdentity mVerifierDeviceIdentity;
950aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // The user's preferred activities associated with particular intent
97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // filters.
98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new IntentResolver<PreferredActivity, PreferredActivity>() {
100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected String packageForFilter(PreferredActivity filter) {
102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return filter.mPref.mComponent.getPackageName();
103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected void dumpFilter(PrintWriter out, String prefix,
106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity filter) {
107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            filter.mPref.dump(out, prefix, filter);
108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    };
110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, SharedUserSetting> mSharedUsers =
111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, SharedUserSetting>();
112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Object> mUserIds = new ArrayList<Object>();
113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final SparseArray<Object> mOtherUserIds =
114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new SparseArray<Object>();
115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // For reading/writing settings file.
117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Signature> mPastSignatures =
118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new ArrayList<Signature>();
119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission names to info about them.
121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissions =
122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission tree names to info about them.
125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissionTrees =
126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been uninstalled and still need their external
129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // storage data deleted.
130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>();
131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been renamed since they were first installed.
133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Keys are the new names of the packages, values are the original
134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.  The packages appear everwhere else under their original
135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.
136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final StringBuilder mReadMessages = new StringBuilder();
139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    /**
141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * Used to track packages that have a shared user ID that hasn't been read
142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * in yet.
143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * <p>
144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * TODO: make this just a local variable that is passed in during package
145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * scanning to make it less confusing.
146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     */
147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    Settings() {
150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        File dataDir = Environment.getDataDirectory();
151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        File systemDir = new File(dataDir, "system");
152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        systemDir.mkdirs();
153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileUtils.setPermissions(systemDir.toString(),
154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.S_IRWXU|FileUtils.S_IRWXG
155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                |FileUtils.S_IROTH|FileUtils.S_IXOTH,
156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                -1, -1);
157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mSettingsFilename = new File(systemDir, "packages.xml");
158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mBackupSettingsFilename = new File(systemDir, "packages-backup.xml");
159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackageListFilename = new File(systemDir, "packages.list");
160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mStoppedPackagesFilename = new File(systemDir, "packages-stopped.xml");
161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mBackupStoppedPackagesFilename = new File(systemDir, "packages-stopped-backup.xml");
162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) {
167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String name = pkg.packageName;
168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add);
170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting peekPackageLPr(String name) {
174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return mPackages.get(name);
175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallStatus(String pkgName, int status) {
178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if(p.getInstallStatus() != status) {
181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setInstallStatus(status);
182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallerPackageName(String pkgName,
187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String installerPkgName) {
188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.setInstallerPackageName(installerPkgName);
191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting getSharedUserLPw(String name,
195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int pkgFlags, boolean create) {
196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s == null) {
198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            s = new SharedUserSetting(name, pkgFlags);
202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                s.userId = newUserIdLPw(s);
204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                s.userId = PackageManagerService.FIRST_APPLICATION_UID;
206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // < 0 means we couldn't assign a userid; fall out and return
209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // s, which is currently null
210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId >= 0) {
211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSharedUsers.put(name, s);
212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return s;
216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean disableSystemPackageLPw(String name) {
219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting dp = mDisabledSysPackages.get(name);
225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // always make sure the system package code and resource paths dont change
226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (dp == null) {
227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mDisabledSysPackages.put(name, p);
231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // a little trick...  when we install the new package, we don't
233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // want to modify the existing PackageSetting for the built-in
234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // version.  so at this point we need a new PackageSetting that
235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // is okay to muck with.
236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageSetting newp = new PackageSetting(p);
237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            replacePackageLPw(name, newp);
238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return false;
241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting enableSystemPackageLPw(String name) {
244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mDisabledSysPackages.get(name);
245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Reset flag in ApplicationInfo object
250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags);
255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.remove(name);
256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.userId == uid) {
264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p;
265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate package, keeping first: " + name);
268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                vc, pkgFlags);
272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.userId = uid;
273447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, p, name)) {
274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.put(name, p);
275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return p;
276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
280447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s != null) {
283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId == uid) {
284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return s;
285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate shared user, keeping first: " + name);
288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s = new SharedUserSetting(name, pkgFlags);
291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s.userId = uid;
292447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, s, name)) {
293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mSharedUsers.put(name, s);
294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return s;
295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Transfer ownership of permissions from one package to another.
300447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void transferPermissionsLPw(String origPkg, String newPkg) {
301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Transfer ownership of permissions to the new package.
302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i=0; i<2; i++) {
303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            HashMap<String, BasePermission> permissions =
304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    i == 0 ? mPermissionTrees : mPermissions;
305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : permissions.values()) {
306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (origPkg.equals(bp.sourcePackage)) {
307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Moving permission " + bp.name
309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " from pkg " + bp.sourcePackage
310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + newPkg);
311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.sourcePackage = newPkg;
312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.packageSetting = null;
313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.perm = null;
314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (bp.pendingInfo != null) {
315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo.packageName = newPkg;
316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.uid = 0;
318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.gids = null;
319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {
327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!p.codePath.equals(codePath)) {
330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Check to see if its a disabled system app
331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // This is an updated system app with versions in both system
333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // and data partition. Just let the most recent version
334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // take precedence.
335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " +
336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.codePathString + " to " + codePath.toString());
337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Just a change in the code path is not an issue, but
339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // let's log a message about it.
340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " + p.codePath
341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + codePath + "; Retaining data and using new");
342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    /*
343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * Since we've changed paths, we need to prefer the new
344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * native library path over the one stored in the
345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * package settings since we might have moved from
346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * internal to external storage or vice versa.
347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     */
348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.nativeLibraryPathString = nativeLibraryPathString;
349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != sharedUser) {
352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " shared user changed from "
354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " to "
356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (sharedUser != null ? sharedUser.name : "<nothing>")
357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; replacing with new");
358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = null;
359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If what we are scanning is a system package, then
362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // make it so, regardless of whether it was previously
363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // installed only in the data partition.
364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p == null) {
369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Create a new PackageSettings entry. this can end up here because
370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // of code path mismatch or user id mismatch of an updated system partition
371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (origPackage != null) {
375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We are consuming the data from an existing package.
376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name
379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " is adopting original package " + origPackage.name);
380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Note that we will retain the new package's signature so
381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // that we can keep its data.
382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageSignatures s = p.signatures;
383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(origPackage);
384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.signatures = s;
385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = origPackage.sharedUser;
386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.userId = origPackage.userId;
387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.origPackage = origPackage;
388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mRenamedPackages.put(name, origPackage.name);
389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                name = origPackage.name;
390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Update new package state.
391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(name, realName, codePath, resourcePath,
394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = sharedUser;
397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is not a system app, it starts out stopped.
398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
399447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (DEBUG_STOPPED) {
400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        RuntimeException e = new RuntimeException("here");
401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        e.fillInStackTrace();
402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.stopped = true;
405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.notLaunched = true;
406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (sharedUser != null) {
408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.userId = sharedUser.userId;
409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Clone the setting here for disabled system packages
411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting dis = mDisabledSysPackages.get(name);
412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dis != null) {
413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // For disabled packages a new setting is created
414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // from the existing user id. This still has to be
415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // added to list of user id's
416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Copy signatures from previous setting
417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (dis.signatures.mSignatures != null) {
418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.signatures.mSignatures = dis.signatures.mSignatures.clone();
419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.userId = dis.userId;
421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone permissions
422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone component info
424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.disabledComponents = new HashSet<String>(dis.disabledComponents);
425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.enabledComponents = new HashSet<String>(dis.enabledComponents);
426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Add new setting to list of user ids
427447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        addUserIdLPw(p.userId, p, name);
428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Assign new user id
430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        p.userId = newUserIdLPw(p);
431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.userId = PackageManagerService.FIRST_APPLICATION_UID;
434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.userId < 0) {
437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " could not be assigned a valid uid");
439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (add) {
442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Finish adding new package by adding it and updating shared
443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // user preferences
444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                addPackageSettingLPw(p, name, sharedUser);
445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.pkg = pkg;
452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.mSetEnabled = p.enabled;
453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.mSetStopped = p.stopped;
454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String codePath = pkg.applicationInfo.sourceDir;
455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String resourcePath = pkg.applicationInfo.publicSourceDir;
456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update code path if needed
457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!codePath.equalsIgnoreCase(p.codePathString)) {
458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.codePathString + " to " + codePath);
460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePath = new File(codePath);
461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePathString = codePath;
462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Update resource path if needed
464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.resourcePathString + " to " + resourcePath);
467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePath = new File(resourcePath);
468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePathString = resourcePath;
469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update the native library path if needed
471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (nativeLibraryPath != null
473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.nativeLibraryPathString = nativeLibraryPath;
475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update version code if needed
477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (pkg.mVersionCode != p.versionCode) {
478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.versionCode = pkg.mVersionCode;
479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // Update signatures if needed.
481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (p.signatures.mSignatures == null) {
482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root             p.signatures.assignSignatures(pkg.mSignatures);
483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         }
484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // If this app defines a shared user id initialize
485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // the shared user signatures as well.
486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root             p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         }
489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Utility method that adds a PackageSetting to mPackages and
493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // completes updating the shared user attributes
494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void addPackageSettingLPw(PackageSetting p, String name,
495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            SharedUserSetting sharedUser) {
496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, p);
497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (sharedUser != null) {
498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null && p.sharedUser != sharedUser) {
499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + p.name + " was user "
501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + p.sharedUser + " but is now " + sharedUser
502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; I am not changing its files so it will probably fail!");
503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (p.userId != sharedUser.userId) {
505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Package " + p.name + " was user id " + p.userId
507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " but is now user " + sharedUser
508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " with id " + sharedUser.userId
509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "; I am not changing its files so it will probably fail!");
510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedUser.packages.add(p);
513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.sharedUser = sharedUser;
514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.userId = sharedUser.userId;
515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /*
519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Update the shared user setting when a package using
520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * specifying the shared user id is removed. The gids
521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * associated with each permission of the deleted package
522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * are removed from the shared user's gid list only if its
523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * not in use by other permissions of packages in the
524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * shared user setting.
525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
526447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
527447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if ((deletedPs == null) || (deletedPs.pkg == null)) {
528447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Slog.i(PackageManagerService.TAG,
529447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Trying to update info for null package. Just ignoring");
530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // No sharedUserId
533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (deletedPs.sharedUser == null) {
534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting sus = deletedPs.sharedUser;
537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update permissions
538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (String eachPerm : deletedPs.pkg.requestedPermissions) {
539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            boolean used = false;
540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!sus.grantedPermissions.contains(eachPerm)) {
541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (PackageSetting pkg:sus.packages) {
544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.pkg != null &&
545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.pkg.requestedPermissions.contains(eachPerm)) {
547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    used = true;
548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    break;
549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!used) {
552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // can safely delete this permission from list
553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                sus.grantedPermissions.remove(eachPerm);
554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update gids
557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int newGids[] = globalGids;
558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (String eachPerm : sus.grantedPermissions) {
559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BasePermission bp = mPermissions.get(eachPerm);
560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp != null) {
561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                newGids = PackageManagerService.appendInts(newGids, bp.gids);
562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        sus.gids = newGids;
565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
567447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int removePackageLPw(String name) {
568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.remove(name);
571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p.sharedUser.packages.size() == 0) {
574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSharedUsers.remove(p.sharedUser.name);
575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    removeUserIdLPw(p.sharedUser.userId);
576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return p.sharedUser.userId;
577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                removeUserIdLPw(p.userId);
580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p.userId;
581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return -1;
584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replacePackageLPw(String name, PackageSetting newp) {
587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.add(newp);
592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                replaceUserIdLPw(p.userId, newp);
594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, newp);
597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
599447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private boolean addUserIdLPw(int uid, Object obj, Object name) {
600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID + PackageManagerService.MAX_APPLICATION_UIDS) {
601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int N = mUserIds.size();
606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while (index >= N) {
608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.add(null);
609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                N++;
610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(index) != null) {
612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate user id: " + uid
614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mUserIds.set(index, obj);
618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mOtherUserIds.get(uid) != null) {
620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate shared id: " + uid
622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public Object getUserIdLPr(int uid) {
631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return index < N ? mUserIds.get(index) : null;
635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return mOtherUserIds.get(uid);
637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
640447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void removeUserIdLPw(int uid) {
641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, null);
645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.remove(uid);
647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
650447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replaceUserIdLPw(int uid, Object obj) {
651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, obj);
655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
660447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeStoppedLPr() {
661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old stopped packages around until we know the new ones have
662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mStoppedPackagesFilename.exists()) {
664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist packages earlier. So preserve the older
666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current packages
667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupStoppedPackagesFilename.exists()) {
669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.renameTo(mBackupStoppedPackagesFilename)) {
670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager stopped packages, "
671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "current changes will be lost at reboot");
672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mStoppedPackagesFilename.delete();
676cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
681447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final FileOutputStream fstr = new FileOutputStream(mStoppedPackagesFilename);
682447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final BufferedOutputStream str = new BufferedOutputStream(fstr);
683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
685447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlSerializer serializer = new FastXmlSerializer();
686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "stopped-packages");
691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
692447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.stopped) {
694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "pkg");
695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", pkg.name);
696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pkg.notLaunched) {
697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "nl", "1");
698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "pkg");
700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "stopped-packages");
704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupStoppedPackagesFilename.delete();
714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mStoppedPackagesFilename.toString(),
715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Done, all is good!
721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager stopped packages, "
724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " current changes will be lost at reboot", e);
725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mStoppedPackagesFilename.exists()) {
729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mStoppedPackagesFilename.delete()) {
730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " + mStoppedPackagesFilename);
731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Note: assumed "stopped" field is already cleared in all packages.
736447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void readStoppedLPw() {
737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupStoppedPackagesFilename.exists()) {
739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupStoppedPackagesFilename);
741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup stopped packages file\n");
742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO, "Need to read from backup stopped packages file");
743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and normal file exist, we
745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the normal one since it might have been
746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mStoppedPackagesFilename);
749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mStoppedPackagesFilename.delete();
750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.exists()) {
759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No stopped packages file found\n");
760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO, "No stopped packages file file; "
761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "assuming all started");
762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // At first boot, make sure no packages are stopped.
763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We usually want to have third party apps initialize
764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // in the stopped state, but not at first boot.
765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    for (PackageSetting pkg : mPackages.values()) {
766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.stopped = false;
767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.notLaunched = false;
768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mStoppedPackagesFilename);
772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
773447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlPullParser parser = Xml.newPullParser();
774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.START_TAG
778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       && type != XmlPullParser.END_DOCUMENT) {
779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in stopped packages file\n");
784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager stopped packages");
786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return;
787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                   && (type != XmlPullParser.END_TAG
792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                           || parser.getDepth() > outerDepth)) {
793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG
794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        || type == XmlPullParser.TEXT) {
795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("pkg")) {
800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String name = parser.getAttributeValue(null, "name");
801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting ps = mPackages.get(name);
802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (ps != null) {
803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        ps.stopped = true;
804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if ("1".equals(parser.getAttributeValue(null, "nl"))) {
805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            ps.notLaunched = true;
806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + name);
809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                          + parser.getName());
814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading stopped packages: " + e);
823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
833447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeLPr() {
834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old settings around until we know the new ones have
837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist settings earlier. So preserve the older
841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current settings
842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupSettingsFilename.exists()) {
844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " current changes will be lost at reboot");
847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSettingsFilename.delete();
851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BufferedOutputStream str = new BufferedOutputStream(fstr);
860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlSerializer serializer = new FastXmlSerializer();
863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "packages");
868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "last-platform-version");
870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "last-platform-version");
873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
8740aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            if (mVerifierDeviceIdentity != null) {
8750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.startTag(null, "verifier");
8760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
8770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.endTag(null, "verifier");
8780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            }
8790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permission-trees");
881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissionTrees.values()) {
882447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permission-trees");
885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permissions");
887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissions.values()) {
888447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permissions");
891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
892447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
893447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePackageLPr(serializer, pkg);
894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
896447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mDisabledSysPackages.values()) {
897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writeDisabledSysPackageLPr(serializer, pkg);
898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "preferred-activities");
901447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PreferredActivity pa : mPreferredActivities.filterSet()) {
902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pa.writeToXml(serializer);
904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "preferred-activities");
907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
908447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final SharedUserSetting usr : mSharedUsers.values()) {
909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "shared-user");
910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", usr.name);
911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "userId",
912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Integer.toString(usr.userId));
913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "perms");
915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (String name : usr.grantedPermissions) {
916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "perms");
921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "shared-user");
922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mPackagesToBeCleaned.size() > 0) {
925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (int i=0; i<mPackagesToBeCleaned.size(); i++) {
926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "cleaning-package");
927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", mPackagesToBeCleaned.get(i));
928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "cleaning-package");
929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mRenamedPackages.size() > 0) {
933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "renamed-package");
935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "new", e.getKey());
936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "old", e.getValue());
937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "renamed-package");
938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "packages");
942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupSettingsFilename.delete();
952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mSettingsFilename.toString(),
953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Write package list file now, use a JournaledFile.
959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //
960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            File tempFile = new File(mPackageListFilename.toString() + ".tmp");
961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            fstr = new FileOutputStream(journal.chooseForWrite());
964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str = new BufferedOutputStream(fstr);
965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                StringBuilder sb = new StringBuilder();
967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (final PackageSetting pkg : mPackages.values()) {
968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ApplicationInfo ai = pkg.pkg.applicationInfo;
969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String dataPath = ai.dataDir;
970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    boolean isDebug  = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Avoid any application that has a space in its path
973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // or that is handled by the system.
974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID)
975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        continue;
976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // we store on each line the following information for now:
978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // pkgName    - package name
980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // userId     - application-specific user id
981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // debugFlag  - 0 or 1 if the package is debuggable.
982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // dataPath   - path to package's data path
983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // NOTE: We prefer not to expose all ApplicationInfo flags for now.
985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //   system/core/run-as/run-as.c
989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.setLength(0);
991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(ai.packageName);
992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(" ");
993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append((int)ai.uid);
994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(isDebug ? " 1 " : " 0 ");
995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(dataPath);
996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append("\n");
997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    str.write(sb.toString().getBytes());
998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.flush();
1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.sync(fstr);
1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.close();
1002cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.commit();
100362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root            } catch (Exception e) {
100462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root                IoUtils.closeQuietly(str);
1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.rollback();
1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mPackageListFilename.toString(),
1009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            writeStoppedLPr();
1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mSettingsFilename.delete()) {
1028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " + mSettingsFilename);
1029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.stopMethodTracing();
1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "updated-package");
1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "name", pkg.name);
1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "perms");
1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // If this is a shared user, the permissions will
1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be written there. We still need to write an
1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // empty permissions list so permissionsFixed will
1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be set.
1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.grantedPermissions) {
1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                BasePermission bp = mPermissions.get(name);
1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (bp != null) {
1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We only need to write signature or system permissions but
1067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // this wont
1068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // match the semantics of grantedPermissions. So write all
1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // permissions.
1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "perms");
1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "updated-package");
1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "package");
1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "name", pkg.name);
1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.uidError) {
1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "uidError", "true");
1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
1108b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn            serializer.attribute(null, "enabled", Integer.toString(pkg.enabled));
1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installStatus", "false");
1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installerPackageName != null) {
1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installer", pkg.installerPackageName);
1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "perms");
1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (pkg.sharedUser == null) {
1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is a shared user, the permissions will
1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be written there. We still need to write an
1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // empty permissions list so permissionsFixed will
1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be set.
1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (final String name : pkg.grantedPermissions) {
1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "perms");
1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.disabledComponents.size() > 0) {
1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "disabled-components");
1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.disabledComponents) {
1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", name);
1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "disabled-components");
1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.enabledComponents.size() > 0) {
1142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "enabled-components");
1143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.enabledComponents) {
1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", name);
1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "enabled-components");
1149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "package");
1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
1155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws XmlPullParserException, java.io.IOException {
1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "item");
1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "name", bp.name);
1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "package", bp.sourcePackage);
1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + bp.type);
1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.type == BasePermission.TYPE_DYNAMIC) {
1167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pi != null) {
1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "type", "dynamic");
1170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.icon != 0) {
1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "icon", Integer.toString(pi.icon));
1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.nonLocalizedLabel != null) {
1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "item");
1179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Iterator<String> its = kList.iterator();
1185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while (its.hasNext()) {
1187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String key = its.next();
1188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final PackageSetting ps = mPackages.get(key);
1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ret.add(ps);
1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean readLPw() {
1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupSettingsFilename.exists()) {
1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupSettingsFilename);
1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup settings file\n");
1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO,
1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Need to read from backup settings file");
1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and settings file exist, we
1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the settings since it might have been
1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mSettingsFilename);
1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSettingsFilename.delete();
1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        mPendingPackages.clear();
1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.exists()) {
1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No settings file found\n");
1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO,
1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "No settings file; creating initial state");
1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return false;
1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mSettingsFilename);
1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlPullParser parser = Xml.newPullParser();
1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.START_TAG
1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && type != XmlPullParser.END_DOCUMENT) {
1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in settings file\n");
1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager settings");
124358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                Log.wtf(PackageManagerService.TAG,
124458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                        "No start tag found in package manager settings");
1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("package")) {
1257447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPackageLPw(parser);
1258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permissions")) {
1259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissions, parser);
1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permission-trees")) {
1261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissionTrees, parser);
1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("shared-user")) {
1263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readSharedUserLPw(parser);
1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-packages")) {
1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // no longer used.
1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-activities")) {
1267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPreferredActivitiesLPw(parser);
1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("updated-package")) {
1269447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledSysPackageLPw(parser);
1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("cleaning-package")) {
1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String name = parser.getAttributeValue(null, "name");
1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (name != null) {
1273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mPackagesToBeCleaned.add(name);
1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("renamed-package")) {
1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String nname = parser.getAttributeValue(null, "new");
1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String oname = parser.getAttributeValue(null, "old");
1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (nname != null && oname != null) {
1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mRenamedPackages.put(nname, oname);
1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("last-platform-version")) {
1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mInternalSdkPlatform = mExternalSdkPlatform = 0;
1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String internal = parser.getAttributeValue(null, "internal");
1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (internal != null) {
1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mInternalSdkPlatform = Integer.parseInt(internal);
1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String external = parser.getAttributeValue(null, "external");
1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (external != null) {
1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mExternalSdkPlatform = Integer.parseInt(external);
1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
12940aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                } else if (tagName.equals("verifier")) {
12950aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    final String deviceIdentity = parser.getAttributeValue(null, "device");
12960aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    try {
12970aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
12980aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    } catch (IllegalArgumentException e) {
12990aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
13000aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                                + e.getMessage());
13010aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    }
1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getName());
1305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (XmlPullParserException e) {
1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (java.io.IOException e) {
1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mPendingPackages.size();
1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final PendingPackage pp = mPendingPackages.get(i);
1326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Object idObj = getUserIdLPr(pp.sharedId);
1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (idObj != null && idObj instanceof SharedUserSetting) {
1328447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p == null) {
1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unable to create application package for " + pp.name);
1334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(pp);
1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (idObj != null) {
1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not a shared uid\n";
1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not defined\n";
1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPendingPackages.clear();
1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
13511d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        /*
13521d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * Make sure all the updated system packages have their shared users
13531d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * associated with them.
13541d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         */
13551d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
13561d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        while (disabledIt.hasNext()) {
13571d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final PackageSetting disabledPs = disabledIt.next();
13581d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final Object id = getUserIdLPr(disabledPs.userId);
13591d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            if (id != null && id instanceof SharedUserSetting) {
13601d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root                disabledPs.sharedUser = (SharedUserSetting) id;
13611d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            }
13621d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        }
13631d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root
1364447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        readStoppedLPw();
1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                + mSharedUsers.size() + " shared uids\n");
1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String v = parser.getAttributeValue(ns, name);
1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (v == null) {
1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return defValue;
1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return Integer.parseInt(v);
1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: attribute " + name
1382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " has bad integer value " + v + " at "
1383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return defValue;
1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1388447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1398447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String tagName = parser.getName();
1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1400447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String name = parser.getAttributeValue(null, "name");
1401447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String sourcePackage = parser.getAttributeValue(null, "package");
1402447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String ptype = parser.getAttributeValue(null, "type");
1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null && sourcePackage != null) {
1404447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final boolean dynamic = "dynamic".equals(ptype);
1405447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final BasePermission bp = new BasePermission(name, sourcePackage,
1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.protectionLevel = readInt(parser, null, "protection",
1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            PermissionInfo.PROTECTION_NORMAL);
1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dynamic) {
1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        PermissionInfo pi = new PermissionInfo();
1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.packageName = sourcePackage.intern();
1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.name = name.intern();
1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.icon = readInt(parser, null, "icon", 0);
1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.protectionLevel = bp.protectionLevel;
1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo = pi;
1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    out.put(bp.name, bp);
1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: permissions has" + " no name at "
1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element reading permissions: " + parser.getName() + " at "
1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = parser.getAttributeValue(null, "name");
1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = parser.getAttributeValue(null, "realName");
1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = parser.getAttributeValue(null, "codePath");
1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (resourcePathStr == null) {
1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = codePathStr;
1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = parser.getAttributeValue(null, "version");
1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (version != null) {
1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                versionCode = Integer.parseInt(version);
1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String timeStampStr = parser.getAttributeValue(null, "ft");
1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                long timeStamp = Long.parseLong(timeStampStr, 16);
1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.setTimeStamp(timeStamp);
1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ts");
1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    long timeStamp = Long.parseLong(timeStampStr);
1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ps.setTimeStamp(timeStamp);
1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "it");
1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "ut");
1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = parser.getAttributeValue(null, "userId");
1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ps.userId = idStr != null ? Integer.parseInt(idStr) : 0;
1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (ps.userId <= 0) {
1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            ps.userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("perms")) {
1503447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                readGrantedPermissionsLPw(parser, ps.grantedPermissions);
1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <updated-package>: " + parser.getName());
1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.put(name, ps);
1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1513447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = null;
1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String sharedIdStr = null;
1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = null;
1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = null;
1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = null;
1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String systemStr = null;
1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String installerPackageName = null;
1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String uidError = null;
1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long timeStamp = 0;
1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long firstInstallTime = 0;
1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long lastUpdateTime = 0;
1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSettingBase packageSetting = null;
1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = null;
1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            name = parser.getAttributeValue(null, "name");
1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            realName = parser.getAttributeValue(null, "realName");
1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            uidError = parser.getAttributeValue(null, "uidError");
1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            codePathStr = parser.getAttributeValue(null, "codePath");
1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            version = parser.getAttributeValue(null, "version");
1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (version != null) {
1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    versionCode = Integer.parseInt(version);
1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            installerPackageName = parser.getAttributeValue(null, "installer");
1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            systemStr = parser.getAttributeValue(null, "flags");
1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (systemStr != null) {
1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags = Integer.parseInt(systemStr);
1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // For backward compatibility
1557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                systemStr = parser.getAttributeValue(null, "system");
1558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (systemStr != null) {
1559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            : 0;
1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Old settings that don't specify system... just treat
1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // them as system, good enough.
1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String timeStampStr = parser.getAttributeValue(null, "ft");
1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    timeStamp = Long.parseLong(timeStampStr, 16);
1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                timeStampStr = parser.getAttributeValue(null, "ts");
1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (timeStampStr != null) {
1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        timeStamp = Long.parseLong(timeStampStr);
1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "it");
1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    firstInstallTime = Long.parseLong(timeStampStr, 16);
1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ut");
1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    lastUpdateTime = Long.parseLong(timeStampStr, 16);
1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " sharedUserId=" + sharedIdStr);
1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (resourcePathStr == null) {
1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePathStr = codePathStr;
1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (realName != null) {
1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                realName = realName.intern();
1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no name at "
1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (codePathStr == null) {
1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no codePath at "
1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId > 0) {
1615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkgFlags);
1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_SETTINGS)
1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " pkg=" + packageSetting);
1621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (packageSetting == null) {
1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
1623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " while parsing settings at "
1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (sharedIdStr != null) {
1631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (userId > 0) {
1633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting = new PendingPackage(name.intern(), realName, new File(
1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
1635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            versionCode, pkgFlags);
1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPendingPackages.add((PendingPackage) packageSetting);
1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_SETTINGS)
1641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Log.i(PackageManagerService.TAG, "Reading package " + name
1642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + ": sharedUserId=" + userId + " pkg=" + packageSetting);
1643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: package " + name
1646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " has bad sharedId " + sharedIdStr + " at "
1647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: package " + name + " has bad userId "
1652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + idStr + " at " + parser.getPositionDescription());
1653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
1657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
1658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSetting != null) {
1660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.uidError = "true".equals(uidError);
1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.installerPackageName = installerPackageName;
1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String enabledStr = parser.getAttributeValue(null, "enabled");
1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (enabledStr != null) {
1665b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                try {
1666b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    packageSetting.enabled = Integer.parseInt(enabledStr);
1667b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                } catch (NumberFormatException e) {
1668b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    if (enabledStr.equalsIgnoreCase("true")) {
1669b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_ENABLED;
1670b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("false")) {
1671b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_DISABLED;
1672b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("default")) {
1673b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1674b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else {
1675b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        PackageManagerService.reportSettingsProblem(Log.WARN,
1676b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                "Error in package manager settings: package " + name
1677b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + " has bad enabled value: " + idStr + " at "
1678b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + parser.getPositionDescription());
1679b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    }
1680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String installStatusStr = parser.getAttributeValue(null, "installStatus");
1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (installStatusStr != null) {
1686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (installStatusStr.equalsIgnoreCase("false")) {
1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
1690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("disabled-components")) {
1703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledComponentsLPw(packageSetting, parser);
1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("enabled-components")) {
1705447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readEnabledComponentsLPw(packageSetting, parser);
1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("sigs")) {
1707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.signatures.readXml(parser, mPastSignatures);
1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
1709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.permissionsFixed = true;
1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <package>: " + parser.getName());
1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1722447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.disabledComponents.add(name.intern());
1737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <disabled-components> has"
1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
1741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <disabled-components>: " + parser.getName());
1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1750447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.enabledComponents.add(name.intern());
1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <enabled-components> has"
1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <enabled-components>: " + parser.getName());
1773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1778447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting su = null;
1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            name = parser.getAttributeValue(null, "name");
1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if ("true".equals(parser.getAttributeValue(null, "system"))) {
1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <shared-user> has no name at "
1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId == 0) {
1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: shared-user " + name
1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + " has bad userId " + idStr + " at "
1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1800447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService
1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ;
1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (su != null) {
1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("sigs")) {
1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    su.signatures.readXml(parser, mPastSignatures);
1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
1826447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, su.grantedPermissions);
1827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <shared-user>: " + parser.getName());
1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1839447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    outPerms.add(name.intern());
1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <perms> has" + " no name at "
1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <perms>: " + parser.getName());
1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1867447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException,
1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity pa = new PreferredActivity(parser);
1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pa.mPref.getParseError() == null) {
1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPreferredActivities.addFilter(pa);
1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <preferred-activity> "
1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + pa.mPref.getParseError() + " at "
1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <preferred-activities>: " + parser.getName());
1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Returns -1 if we could not find an available UserId to assign
1897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private int newUserIdLPw(Object obj) {
1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Let's be stupidly inefficient for now...
1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mUserIds.size();
1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(i) == null) {
1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.set(i, obj);
1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return PackageManagerService.FIRST_APPLICATION_UID + i;
1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // None left?
1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (N >= PackageManagerService.MAX_APPLICATION_UIDS) {
1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return -1;
1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mUserIds.add(obj);
1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return PackageManagerService.FIRST_APPLICATION_UID + N;
1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
19160aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
19170aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        if (mVerifierDeviceIdentity == null) {
19180aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
19190aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
19200aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            writeLPr();
19210aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        }
19220aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
19230aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        return mVerifierDeviceIdentity;
19240aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    }
19250aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
1926447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public PackageSetting getDisabledSystemPkgLPr(String name) {
1927447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ps = mDisabledSysPackages.get(name);
1928447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return ps;
1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1931447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean isEnabledLPr(ComponentInfo componentInfo, int flags) {
1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final PackageSetting packageSettings = mPackages.get(componentInfo.packageName);
1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (PackageManagerService.DEBUG_SETTINGS) {
1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " + componentInfo.packageName
1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + " componentName = " + componentInfo.name);
1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "enabledComponents: "
1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + Arrays.toString(packageSettings.enabledComponents.toArray()));
1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "disabledComponents: "
1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + Arrays.toString(packageSettings.disabledComponents.toArray()));
1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings == null) {
1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED
19480ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn                || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
1949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.enabledComponents.contains(componentInfo.name)) {
1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.disabledComponents.contains(componentInfo.name)) {
1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return componentInfo.enabled;
1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1962447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    String getInstallerPackageNameLPr(String packageName) {
1963447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1964447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1965447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1966447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.installerPackageName;
1968447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1969447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1970447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int getApplicationEnabledSettingLPr(String packageName) {
1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1972447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1973447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1974447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1975447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.enabled;
1976447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1977447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1978447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int getComponentEnabledSettingLPr(ComponentName componentName) {
1979447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String packageName = componentName.getPackageName();
1980447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1981447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1982447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown component: " + componentName);
1983447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1984447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String classNameStr = componentName.getClassName();
1985447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.getCurrentEnabledStateLPr(classNameStr);
1986447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1987447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1988447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
1989447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            boolean allowedByPermission, int uid) {
1990447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkgSetting = mPackages.get(packageName);
1991447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting == null) {
1992447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1993447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1994447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (!allowedByPermission && (uid != pkgSetting.userId)) {
1995447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new SecurityException(
1996447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Permission Denial: attempt to change stopped state from pid="
1997447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + Binder.getCallingPid()
1998447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + ", uid=" + uid + ", package uid=" + pkgSetting.userId);
1999447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2000447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (DEBUG_STOPPED) {
2001447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (stopped) {
2002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                RuntimeException e = new RuntimeException("here");
2003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                e.fillInStackTrace();
2004447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                Slog.i(TAG, "Stopping package " + packageName, e);
2005447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2006447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2007447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting.stopped != stopped) {
2008447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pkgSetting.stopped = stopped;
2009447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pkgSetting.pkg.mSetStopped = stopped;
2010447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (pkgSetting.notLaunched) {
2011447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (pkgSetting.installerPackageName != null) {
2012447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
2013447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.name, null,
2014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.installerPackageName, null);
2015447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pkgSetting.notLaunched = false;
2017447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            return true;
2019447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2020447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return false;
2021447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2023447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2024447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Date date = new Date();
2026447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2027447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (final PackageSetting ps : mPackages.values()) {
2028447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(ps.realName)
2029447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    && !packageName.equals(ps.name)) {
2030447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2031447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2032447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2033447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null) {
2034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                dumpState.setSharedUser(ps.sharedUser);
2035447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2036447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2037447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2038447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2039447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2040447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Packages:");
2041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2042447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2043447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Package [");
2044447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2045447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2046447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2047447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2048447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2049447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.realName != null) {
2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    compat name=");
2051447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.name);
2052447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2053447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2054447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId="); pw.print(ps.userId);
2055447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2056447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sharedUser="); pw.println(ps.sharedUser);
2057447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkg="); pw.println(ps.pkg);
2058447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    codePath="); pw.println(ps.codePathString);
2059447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    resourcePath="); pw.println(ps.resourcePathString);
2060447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2061447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    versionCode="); pw.println(ps.versionCode);
2062447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.pkg != null) {
2063447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    versionName="); pw.println(ps.pkg.mVersionName);
2064447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2065447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2066447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.pkg.mOperationPending) {
2067447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("    mOperationPending=true");
2068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2069447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    supportsScreens=[");
2070447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                boolean first = true;
2071447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2072447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2074447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2075447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("small");
2076447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2077447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2078447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2079447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2081447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("medium");
2082447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2083447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2084447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2085447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2086447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2087447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("large");
2088447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2089447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2090447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2091447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2092447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2093447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("xlarge");
2094447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2095447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2096447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2097447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2098447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2099447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("resizeable");
2100447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2101447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2102447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2104447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2105447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("anyDensity");
2106447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2107447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2108447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("]");
2109447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    timeStamp=");
2110447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.timeStamp);
2111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2112447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    firstInstallTime=");
2113447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.firstInstallTime);
2114447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2115447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    lastUpdateTime=");
2116447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.lastUpdateTime);
2117447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2118447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.installerPackageName != null) {
2119447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    installerPackageName="); pw.println(ps.installerPackageName);
2120447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2121447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    signatures="); pw.println(ps.signatures);
2122447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    permissionsFixed="); pw.print(ps.permissionsFixed);
2123447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" haveGids="); pw.println(ps.haveGids);
2124447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
2125447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" installStatus="); pw.print(ps.installStatus);
2126447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" stopped="); pw.print(ps.stopped);
2127447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" enabled="); pw.println(ps.enabled);
2128447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.disabledComponents.size() > 0) {
2129447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    disabledComponents:");
2130447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.disabledComponents) {
2131447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2132447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2133447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.enabledComponents.size() > 0) {
2135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    enabledComponents:");
2136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.enabledComponents) {
2137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.grantedPermissions.size() > 0) {
2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    grantedPermissions:");
2142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.grantedPermissions) {
2143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2148447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mRenamedPackages.size() > 0) {
2150447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
2151447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(e.getKey())
2152447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(e.getValue())) {
2153447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2156447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2157447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Renamed packages:");
2159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2160447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  ");
2162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(e.getKey());
2163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(" -> ");
2164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(e.getValue());
2165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mDisabledSysPackages.size() > 0) {
2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting ps : mDisabledSysPackages.values()) {
2171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(ps.realName)
2172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(ps.name)) {
2173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2177447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2178447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Hidden system packages:");
2179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2181447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  Package [");
2182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2186447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.realName != null) {
2187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("    compat name=");
2188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(ps.name);
2189447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2190447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    userId=");
2191447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.userId);
2192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    sharedUser=");
2193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.sharedUser);
2194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    codePath=");
2195447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.codePathString);
2196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    resourcePath=");
2197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.resourcePathString);
2198447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2199447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2200447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2202447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2204447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (BasePermission p : mPermissions.values()) {
2205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(p.sourcePackage)) {
2206447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2207447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2209447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2210447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Permissions:");
2212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2214447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Permission ["); pw.print(p.name); pw.print("] (");
2215447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(Integer.toHexString(System.identityHashCode(p)));
2216447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sourcePackage="); pw.println(p.sourcePackage);
2218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    uid="); pw.print(p.uid);
2219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2220447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" type="); pw.print(p.type);
2221447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" prot="); pw.println(p.protectionLevel);
2222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.packageSetting != null) {
2223447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    packageSetting="); pw.println(p.packageSetting);
2224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2225447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.perm != null) {
2226447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    perm="); pw.println(p.perm);
2227447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2228447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2229447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2230447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2232447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2233447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (SharedUserSetting su : mSharedUsers.values()) {
2234447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && su != dumpState.getSharedUser()) {
2235447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2236447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2238447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2239447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2240447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Shared users:");
2241447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2242447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  SharedUser [");
2244447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.name);
2245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("] (");
2246447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(Integer.toHexString(System.identityHashCode(su)));
2247447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId=");
2249447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.userId);
2250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids=");
2251447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println(PackageManagerService.arrayToString(su.gids));
2252447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("    grantedPermissions:");
2253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (String s : su.grantedPermissions) {
2254447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("      ");
2255447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(s);
2256447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2257447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2258447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2259447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2260447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.println("Settings parse messages:");
2262447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.print(mReadMessages.toString());
2263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root}