Settings.java revision b8f400020b201cc40f5e16277af0dbafec38b8a3
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;
42447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder;
43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment;
44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils;
45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process;
46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log;
47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog;
48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray;
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml;
50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream;
52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream;
54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream;
55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException;
56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter;
57447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat;
58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList;
59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays;
60447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date;
61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap;
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator;
64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings.
67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings {
69447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final String TAG = "PackageSettings";
70447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
71447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final boolean DEBUG_STOPPED = false;
72447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
73cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mSettingsFilename;
74cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupSettingsFilename;
75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mPackageListFilename;
76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mStoppedPackagesFilename;
77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupStoppedPackagesFilename;
78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mPackages =
79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, PackageSetting>();
80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // List of replaced system applications
81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mDisabledSysPackages =
82cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        new HashMap<String, PackageSetting>();
83cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
84cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // These are the last platform API version we were using for
85cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // the apps installed on internal and external storage.  It is
86cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // used to grant newer permissions one time during a system upgrade.
87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mInternalSdkPlatform;
88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mExternalSdkPlatform;
89cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
90cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // The user's preferred activities associated with particular intent
91cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // filters.
92cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
93cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new IntentResolver<PreferredActivity, PreferredActivity>() {
94cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
95cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected String packageForFilter(PreferredActivity filter) {
96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return filter.mPref.mComponent.getPackageName();
97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected void dumpFilter(PrintWriter out, String prefix,
100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity filter) {
101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            filter.mPref.dump(out, prefix, filter);
102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    };
104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, SharedUserSetting> mSharedUsers =
105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, SharedUserSetting>();
106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Object> mUserIds = new ArrayList<Object>();
107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final SparseArray<Object> mOtherUserIds =
108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new SparseArray<Object>();
109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // For reading/writing settings file.
111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Signature> mPastSignatures =
112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new ArrayList<Signature>();
113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission names to info about them.
115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissions =
116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission tree names to info about them.
119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissionTrees =
120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been uninstalled and still need their external
123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // storage data deleted.
124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>();
125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been renamed since they were first installed.
127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Keys are the new names of the packages, values are the original
128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.  The packages appear everwhere else under their original
129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.
130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final StringBuilder mReadMessages = new StringBuilder();
133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    /**
135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * Used to track packages that have a shared user ID that hasn't been read
136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * in yet.
137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * <p>
138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * TODO: make this just a local variable that is passed in during package
139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * scanning to make it less confusing.
140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     */
141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    Settings() {
144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        File dataDir = Environment.getDataDirectory();
145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        File systemDir = new File(dataDir, "system");
146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        systemDir.mkdirs();
147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileUtils.setPermissions(systemDir.toString(),
148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.S_IRWXU|FileUtils.S_IRWXG
149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                |FileUtils.S_IROTH|FileUtils.S_IXOTH,
150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                -1, -1);
151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mSettingsFilename = new File(systemDir, "packages.xml");
152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mBackupSettingsFilename = new File(systemDir, "packages-backup.xml");
153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackageListFilename = new File(systemDir, "packages.list");
154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mStoppedPackagesFilename = new File(systemDir, "packages-stopped.xml");
155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mBackupStoppedPackagesFilename = new File(systemDir, "packages-stopped-backup.xml");
156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) {
161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String name = pkg.packageName;
162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add);
164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting peekPackageLPr(String name) {
168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return mPackages.get(name);
169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallStatus(String pkgName, int status) {
172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if(p.getInstallStatus() != status) {
175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setInstallStatus(status);
176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallerPackageName(String pkgName,
181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String installerPkgName) {
182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.setInstallerPackageName(installerPkgName);
185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting getSharedUserLPw(String name,
189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int pkgFlags, boolean create) {
190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s == null) {
192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            s = new SharedUserSetting(name, pkgFlags);
196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                s.userId = newUserIdLPw(s);
198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                s.userId = PackageManagerService.FIRST_APPLICATION_UID;
200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // < 0 means we couldn't assign a userid; fall out and return
203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // s, which is currently null
204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId >= 0) {
205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSharedUsers.put(name, s);
206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return s;
210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean disableSystemPackageLPw(String name) {
213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting dp = mDisabledSysPackages.get(name);
219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // always make sure the system package code and resource paths dont change
220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (dp == null) {
221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mDisabledSysPackages.put(name, p);
225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // a little trick...  when we install the new package, we don't
227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // want to modify the existing PackageSetting for the built-in
228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // version.  so at this point we need a new PackageSetting that
229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // is okay to muck with.
230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageSetting newp = new PackageSetting(p);
231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            replacePackageLPw(name, newp);
232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return false;
235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting enableSystemPackageLPw(String name) {
238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mDisabledSysPackages.get(name);
239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Reset flag in ApplicationInfo object
244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
247447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.nativeLibraryPathString, p.userId, p.versionCode, p.pkgFlags);
249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.remove(name);
250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
253447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.userId == uid) {
258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p;
259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate package, keeping first: " + name);
262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                vc, pkgFlags);
266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.userId = uid;
267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, p, name)) {
268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.put(name, p);
269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return p;
270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
274447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s != null) {
277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId == uid) {
278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return s;
279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate shared user, keeping first: " + name);
282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s = new SharedUserSetting(name, pkgFlags);
285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s.userId = uid;
286447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, s, name)) {
287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mSharedUsers.put(name, s);
288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return s;
289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Transfer ownership of permissions from one package to another.
294447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void transferPermissionsLPw(String origPkg, String newPkg) {
295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Transfer ownership of permissions to the new package.
296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i=0; i<2; i++) {
297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            HashMap<String, BasePermission> permissions =
298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    i == 0 ? mPermissionTrees : mPermissions;
299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : permissions.values()) {
300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (origPkg.equals(bp.sourcePackage)) {
301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Moving permission " + bp.name
303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " from pkg " + bp.sourcePackage
304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + newPkg);
305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.sourcePackage = newPkg;
306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.packageSetting = null;
307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.perm = null;
308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (bp.pendingInfo != null) {
309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo.packageName = newPkg;
310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.uid = 0;
312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.gids = null;
313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
318447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {
321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!p.codePath.equals(codePath)) {
324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Check to see if its a disabled system app
325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // This is an updated system app with versions in both system
327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // and data partition. Just let the most recent version
328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // take precedence.
329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Trying to update system app code path from " +
330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.codePathString + " to " + codePath.toString());
331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Just a change in the code path is not an issue, but
333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // let's log a message about it.
334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from " + p.codePath
335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + codePath + "; Retaining data and using new");
336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    /*
337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * Since we've changed paths, we need to prefer the new
338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * native library path over the one stored in the
339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * package settings since we might have moved from
340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * internal to external storage or vice versa.
341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     */
342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.nativeLibraryPathString = nativeLibraryPathString;
343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != sharedUser) {
346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " shared user changed from "
348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " to "
350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (sharedUser != null ? sharedUser.name : "<nothing>")
351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; replacing with new");
352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = null;
353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If what we are scanning is a system package, then
356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // make it so, regardless of whether it was previously
357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // installed only in the data partition.
358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p == null) {
363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Create a new PackageSettings entry. this can end up here because
364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // of code path mismatch or user id mismatch of an updated system partition
365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (origPackage != null) {
369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We are consuming the data from an existing package.
370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package " + name
373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " is adopting original package " + origPackage.name);
374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Note that we will retain the new package's signature so
375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // that we can keep its data.
376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageSignatures s = p.signatures;
377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(origPackage);
378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.signatures = s;
379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = origPackage.sharedUser;
380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.userId = origPackage.userId;
381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.origPackage = origPackage;
382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mRenamedPackages.put(name, origPackage.name);
383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                name = origPackage.name;
384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Update new package state.
385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(name, realName, codePath, resourcePath,
388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = sharedUser;
391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is not a system app, it starts out stopped.
392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
393447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (DEBUG_STOPPED) {
394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        RuntimeException e = new RuntimeException("here");
395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        e.fillInStackTrace();
396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.stopped = true;
399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.notLaunched = true;
400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (sharedUser != null) {
402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.userId = sharedUser.userId;
403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (PackageManagerService.MULTIPLE_APPLICATION_UIDS) {
404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Clone the setting here for disabled system packages
405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting dis = mDisabledSysPackages.get(name);
406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dis != null) {
407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // For disabled packages a new setting is created
408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // from the existing user id. This still has to be
409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // added to list of user id's
410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Copy signatures from previous setting
411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (dis.signatures.mSignatures != null) {
412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.signatures.mSignatures = dis.signatures.mSignatures.clone();
413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.userId = dis.userId;
415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone permissions
416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone component info
418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.disabledComponents = new HashSet<String>(dis.disabledComponents);
419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.enabledComponents = new HashSet<String>(dis.enabledComponents);
420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Add new setting to list of user ids
421447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        addUserIdLPw(p.userId, p, name);
422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Assign new user id
424447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        p.userId = newUserIdLPw(p);
425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.userId = PackageManagerService.FIRST_APPLICATION_UID;
428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.userId < 0) {
431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " could not be assigned a valid uid");
433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (add) {
436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Finish adding new package by adding it and updating shared
437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // user preferences
438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                addPackageSettingLPw(p, name, sharedUser);
439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.pkg = pkg;
446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.mSetEnabled = p.enabled;
447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.mSetStopped = p.stopped;
448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String codePath = pkg.applicationInfo.sourceDir;
449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String resourcePath = pkg.applicationInfo.publicSourceDir;
450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update code path if needed
451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!codePath.equalsIgnoreCase(p.codePathString)) {
452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.codePathString + " to " + codePath);
454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePath = new File(codePath);
455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePathString = codePath;
456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Update resource path if needed
458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.resourcePathString + " to " + resourcePath);
461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePath = new File(resourcePath);
462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePathString = resourcePath;
463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update the native library path if needed
465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (nativeLibraryPath != null
467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.nativeLibraryPathString = nativeLibraryPath;
469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update version code if needed
471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (pkg.mVersionCode != p.versionCode) {
472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.versionCode = pkg.mVersionCode;
473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // Update signatures if needed.
475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (p.signatures.mSignatures == null) {
476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root             p.signatures.assignSignatures(pkg.mSignatures);
477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         }
478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // If this app defines a shared user id initialize
479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         // the shared user signatures as well.
480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root             p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root         }
483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Utility method that adds a PackageSetting to mPackages and
487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // completes updating the shared user attributes
488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void addPackageSettingLPw(PackageSetting p, String name,
489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            SharedUserSetting sharedUser) {
490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, p);
491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (sharedUser != null) {
492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null && p.sharedUser != sharedUser) {
493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + p.name + " was user "
495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + p.sharedUser + " but is now " + sharedUser
496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; I am not changing its files so it will probably fail!");
497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (p.userId != sharedUser.userId) {
499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Package " + p.name + " was user id " + p.userId
501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " but is now user " + sharedUser
502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " with id " + sharedUser.userId
503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "; I am not changing its files so it will probably fail!");
504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedUser.packages.add(p);
507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.sharedUser = sharedUser;
508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.userId = sharedUser.userId;
509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /*
513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Update the shared user setting when a package using
514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * specifying the shared user id is removed. The gids
515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * associated with each permission of the deleted package
516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * are removed from the shared user's gid list only if its
517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * not in use by other permissions of packages in the
518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * shared user setting.
519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
520447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if ((deletedPs == null) || (deletedPs.pkg == null)) {
522447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Slog.i(PackageManagerService.TAG,
523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Trying to update info for null package. Just ignoring");
524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // No sharedUserId
527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (deletedPs.sharedUser == null) {
528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting sus = deletedPs.sharedUser;
531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update permissions
532447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (String eachPerm : deletedPs.pkg.requestedPermissions) {
533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            boolean used = false;
534447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!sus.grantedPermissions.contains(eachPerm)) {
535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (PackageSetting pkg:sus.packages) {
538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.pkg != null &&
539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.pkg.requestedPermissions.contains(eachPerm)) {
541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    used = true;
542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    break;
543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!used) {
546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // can safely delete this permission from list
547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                sus.grantedPermissions.remove(eachPerm);
548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update gids
551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int newGids[] = globalGids;
552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (String eachPerm : sus.grantedPermissions) {
553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BasePermission bp = mPermissions.get(eachPerm);
554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp != null) {
555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                newGids = PackageManagerService.appendInts(newGids, bp.gids);
556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        sus.gids = newGids;
559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int removePackageLPw(String name) {
562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.remove(name);
565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p.sharedUser.packages.size() == 0) {
568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSharedUsers.remove(p.sharedUser.name);
569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    removeUserIdLPw(p.sharedUser.userId);
570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return p.sharedUser.userId;
571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                removeUserIdLPw(p.userId);
574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p.userId;
575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return -1;
578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replacePackageLPw(String name, PackageSetting newp) {
581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.add(newp);
586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                replaceUserIdLPw(p.userId, newp);
588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, newp);
591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private boolean addUserIdLPw(int uid, Object obj, Object name) {
594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID + PackageManagerService.MAX_APPLICATION_UIDS) {
595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int N = mUserIds.size();
600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while (index >= N) {
602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.add(null);
603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                N++;
604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(index) != null) {
606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate user id: " + uid
608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mUserIds.set(index, obj);
612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mOtherUserIds.get(uid) != null) {
614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate shared id: " + uid
616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public Object getUserIdLPr(int uid) {
625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return index < N ? mUserIds.get(index) : null;
629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return mOtherUserIds.get(uid);
631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void removeUserIdLPw(int uid) {
635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, null);
639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.remove(uid);
641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replaceUserIdLPw(int uid, Object obj) {
645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (uid >= PackageManagerService.FIRST_APPLICATION_UID) {
646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int index = uid - PackageManagerService.FIRST_APPLICATION_UID;
648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, obj);
649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
652cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
654447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeStoppedLPr() {
655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old stopped packages around until we know the new ones have
656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mStoppedPackagesFilename.exists()) {
658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist packages earlier. So preserve the older
660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current packages
661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupStoppedPackagesFilename.exists()) {
663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.renameTo(mBackupStoppedPackagesFilename)) {
664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager stopped packages, "
665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "current changes will be lost at reboot");
666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mStoppedPackagesFilename.delete();
670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final FileOutputStream fstr = new FileOutputStream(mStoppedPackagesFilename);
676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final BufferedOutputStream str = new BufferedOutputStream(fstr);
677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
679447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlSerializer serializer = new FastXmlSerializer();
680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "stopped-packages");
685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.stopped) {
688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "pkg");
689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", pkg.name);
690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pkg.notLaunched) {
691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "nl", "1");
692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "pkg");
694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "stopped-packages");
698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupStoppedPackagesFilename.delete();
708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mStoppedPackagesFilename.toString(),
709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Done, all is good!
715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager stopped packages, "
718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " current changes will be lost at reboot", e);
719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mStoppedPackagesFilename.exists()) {
723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mStoppedPackagesFilename.delete()) {
724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: " + mStoppedPackagesFilename);
725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Note: assumed "stopped" field is already cleared in all packages.
730447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void readStoppedLPw() {
731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupStoppedPackagesFilename.exists()) {
733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupStoppedPackagesFilename);
735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup stopped packages file\n");
736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO, "Need to read from backup stopped packages file");
737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and normal file exist, we
739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the normal one since it might have been
740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mStoppedPackagesFilename);
743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mStoppedPackagesFilename.delete();
744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.exists()) {
753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No stopped packages file found\n");
754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO, "No stopped packages file file; "
755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "assuming all started");
756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // At first boot, make sure no packages are stopped.
757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We usually want to have third party apps initialize
758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // in the stopped state, but not at first boot.
759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    for (PackageSetting pkg : mPackages.values()) {
760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.stopped = false;
761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.notLaunched = false;
762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mStoppedPackagesFilename);
766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
767447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlPullParser parser = Xml.newPullParser();
768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.START_TAG
772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       && type != XmlPullParser.END_DOCUMENT) {
773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in stopped packages file\n");
778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager stopped packages");
780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return;
781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                   && (type != XmlPullParser.END_TAG
786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                           || parser.getDepth() > outerDepth)) {
787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG
788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        || type == XmlPullParser.TEXT) {
789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("pkg")) {
794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String name = parser.getAttributeValue(null, "name");
795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting ps = mPackages.get(name);
796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (ps != null) {
797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        ps.stopped = true;
798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if ("1".equals(parser.getAttributeValue(null, "nl"))) {
799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            ps.notLaunched = true;
800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.w(PackageManagerService.TAG, "No package known for stopped package: " + name);
803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                          + parser.getName());
808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading stopped packages: " + e);
817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
827447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeLPr() {
828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old settings around until we know the new ones have
831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist settings earlier. So preserve the older
835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current settings
836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupSettingsFilename.exists()) {
838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " current changes will be lost at reboot");
841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSettingsFilename.delete();
845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BufferedOutputStream str = new BufferedOutputStream(fstr);
854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlSerializer serializer = new FastXmlSerializer();
857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "packages");
862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "last-platform-version");
864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "last-platform-version");
867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permission-trees");
869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissionTrees.values()) {
870447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permission-trees");
873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permissions");
875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissions.values()) {
876447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permissions");
879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
880447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
881447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePackageLPr(serializer, pkg);
882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
884447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mDisabledSysPackages.values()) {
885447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writeDisabledSysPackageLPr(serializer, pkg);
886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "preferred-activities");
889447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PreferredActivity pa : mPreferredActivities.filterSet()) {
890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pa.writeToXml(serializer);
892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "preferred-activities");
895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
896447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final SharedUserSetting usr : mSharedUsers.values()) {
897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "shared-user");
898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", usr.name);
899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "userId",
900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Integer.toString(usr.userId));
901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "perms");
903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (String name : usr.grantedPermissions) {
904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "perms");
909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "shared-user");
910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mPackagesToBeCleaned.size() > 0) {
913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (int i=0; i<mPackagesToBeCleaned.size(); i++) {
914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "cleaning-package");
915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", mPackagesToBeCleaned.get(i));
916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "cleaning-package");
917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mRenamedPackages.size() > 0) {
921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "renamed-package");
923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "new", e.getKey());
924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "old", e.getValue());
925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "renamed-package");
926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "packages");
930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupSettingsFilename.delete();
940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mSettingsFilename.toString(),
941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Write package list file now, use a JournaledFile.
947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //
948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            File tempFile = new File(mPackageListFilename.toString() + ".tmp");
949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            fstr = new FileOutputStream(journal.chooseForWrite());
952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str = new BufferedOutputStream(fstr);
953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                StringBuilder sb = new StringBuilder();
955447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (final PackageSetting pkg : mPackages.values()) {
956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ApplicationInfo ai = pkg.pkg.applicationInfo;
957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String dataPath = ai.dataDir;
958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    boolean isDebug  = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Avoid any application that has a space in its path
961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // or that is handled by the system.
962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID)
963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        continue;
964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // we store on each line the following information for now:
966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // pkgName    - package name
968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // userId     - application-specific user id
969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // debugFlag  - 0 or 1 if the package is debuggable.
970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // dataPath   - path to package's data path
971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // NOTE: We prefer not to expose all ApplicationInfo flags for now.
973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //   system/core/run-as/run-as.c
977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.setLength(0);
979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(ai.packageName);
980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(" ");
981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append((int)ai.uid);
982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(isDebug ? " 1 " : " 0 ");
983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(dataPath);
984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append("\n");
985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    str.write(sb.toString().getBytes());
986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.flush();
988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.sync(fstr);
989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.close();
990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.commit();
991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            catch (Exception  e) {
993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.rollback();
994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mPackageListFilename.toString(),
997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP
999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    |FileUtils.S_IROTH,
1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            writeStoppedLPr();
1003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mSettingsFilename.delete()) {
1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: " + mSettingsFilename);
1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.stopMethodTracing();
1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "updated-package");
1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "name", pkg.name);
1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "perms");
1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // If this is a shared user, the permissions will
1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be written there. We still need to write an
1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // empty permissions list so permissionsFixed will
1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be set.
1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.grantedPermissions) {
1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                BasePermission bp = mPermissions.get(name);
1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (bp != null) {
1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We only need to write signature or system permissions but
1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // this wont
1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // match the semantics of grantedPermissions. So write all
1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // permissions.
1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "perms");
1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "updated-package");
1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "package");
1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "name", pkg.name);
1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "userId", Integer.toString(pkg.userId));
1089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.userId));
1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.uidError) {
1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "uidError", "true");
1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
1096b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn            serializer.attribute(null, "enabled", Integer.toString(pkg.enabled));
1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installStatus", "false");
1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installerPackageName != null) {
1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installer", pkg.installerPackageName);
1103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "perms");
1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (pkg.sharedUser == null) {
1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is a shared user, the permissions will
1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be written there. We still need to write an
1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // empty permissions list so permissionsFixed will
1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be set.
1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (final String name : pkg.grantedPermissions) {
1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "item");
1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "name", name);
1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "item");
1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "perms");
1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.disabledComponents.size() > 0) {
1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "disabled-components");
1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.disabledComponents) {
1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", name);
1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "disabled-components");
1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.enabledComponents.size() > 0) {
1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "enabled-components");
1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.enabledComponents) {
1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "item");
1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "name", name);
1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "item");
1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "enabled-components");
1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "package");
1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
1143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws XmlPullParserException, java.io.IOException {
1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "item");
1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "name", bp.name);
1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "package", bp.sourcePackage);
1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + bp.type);
1154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.type == BasePermission.TYPE_DYNAMIC) {
1155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pi != null) {
1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "type", "dynamic");
1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.icon != 0) {
1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "icon", Integer.toString(pi.icon));
1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.nonLocalizedLabel != null) {
1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "item");
1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Iterator<String> its = kList.iterator();
1173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while (its.hasNext()) {
1175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String key = its.next();
1176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final PackageSetting ps = mPackages.get(key);
1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ret.add(ps);
1179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean readLPw() {
1185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupSettingsFilename.exists()) {
1187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupSettingsFilename);
1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup settings file\n");
1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO,
1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Need to read from backup settings file");
1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and settings file exist, we
1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the settings since it might have been
1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mSettingsFilename);
1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSettingsFilename.delete();
1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        mPendingPackages.clear();
1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.exists()) {
1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No settings file found\n");
1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO,
1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "No settings file; creating initial state");
1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return false;
1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mSettingsFilename);
1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlPullParser parser = Xml.newPullParser();
1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.START_TAG
1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && type != XmlPullParser.END_DOCUMENT) {
1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in settings file\n");
1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager settings");
1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log
1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        .wtf(PackageManagerService.TAG,
1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                "No start tag found in package manager settings");
1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("package")) {
1246447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPackageLPw(parser);
1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permissions")) {
1248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissions, parser);
1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permission-trees")) {
1250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissionTrees, parser);
1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("shared-user")) {
1252447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readSharedUserLPw(parser);
1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-packages")) {
1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // no longer used.
1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-activities")) {
1256447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPreferredActivitiesLPw(parser);
1257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("updated-package")) {
1258447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledSysPackageLPw(parser);
1259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("cleaning-package")) {
1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String name = parser.getAttributeValue(null, "name");
1261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (name != null) {
1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mPackagesToBeCleaned.add(name);
1263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("renamed-package")) {
1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String nname = parser.getAttributeValue(null, "new");
1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String oname = parser.getAttributeValue(null, "old");
1267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (nname != null && oname != null) {
1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mRenamedPackages.put(nname, oname);
1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("last-platform-version")) {
1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mInternalSdkPlatform = mExternalSdkPlatform = 0;
1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String internal = parser.getAttributeValue(null, "internal");
1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (internal != null) {
1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mInternalSdkPlatform = Integer.parseInt(internal);
1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String external = parser.getAttributeValue(null, "external");
1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (external != null) {
1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mExternalSdkPlatform = Integer.parseInt(external);
1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getName());
1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (XmlPullParserException e) {
1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (java.io.IOException e) {
1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mPendingPackages.size();
1305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final PendingPackage pp = mPendingPackages.get(i);
1307447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Object idObj = getUserIdLPr(pp.sharedId);
1308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (idObj != null && idObj instanceof SharedUserSetting) {
1309447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p == null) {
1313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unable to create application package for " + pp.name);
1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(pp);
1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (idObj != null) {
1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not a shared uid\n";
1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not defined\n";
1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPendingPackages.clear();
1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
13321d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        /*
13331d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * Make sure all the updated system packages have their shared users
13341d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * associated with them.
13351d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         */
13361d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
13371d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        while (disabledIt.hasNext()) {
13381d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final PackageSetting disabledPs = disabledIt.next();
13391d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final Object id = getUserIdLPr(disabledPs.userId);
13401d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            if (id != null && id instanceof SharedUserSetting) {
13411d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root                disabledPs.sharedUser = (SharedUserSetting) id;
13421d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            }
13431d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        }
13441d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root
1345447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        readStoppedLPw();
1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                + mSharedUsers.size() + " shared uids\n");
1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
1351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String v = parser.getAttributeValue(ns, name);
1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (v == null) {
1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return defValue;
1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return Integer.parseInt(v);
1360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: attribute " + name
1363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " has bad integer value " + v + " at "
1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return defValue;
1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1369447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1379447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String tagName = parser.getName();
1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1381447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String name = parser.getAttributeValue(null, "name");
1382447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String sourcePackage = parser.getAttributeValue(null, "package");
1383447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String ptype = parser.getAttributeValue(null, "type");
1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null && sourcePackage != null) {
1385447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final boolean dynamic = "dynamic".equals(ptype);
1386447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final BasePermission bp = new BasePermission(name, sourcePackage,
1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.protectionLevel = readInt(parser, null, "protection",
1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            PermissionInfo.PROTECTION_NORMAL);
1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dynamic) {
1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        PermissionInfo pi = new PermissionInfo();
1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.packageName = sourcePackage.intern();
1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.name = name.intern();
1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.icon = readInt(parser, null, "icon", 0);
1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.protectionLevel = bp.protectionLevel;
1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo = pi;
1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    out.put(bp.name, bp);
1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: permissions has" + " no name at "
1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element reading permissions: " + parser.getName() + " at "
1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1414447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = parser.getAttributeValue(null, "name");
1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = parser.getAttributeValue(null, "realName");
1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = parser.getAttributeValue(null, "codePath");
1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (resourcePathStr == null) {
1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = codePathStr;
1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = parser.getAttributeValue(null, "version");
1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (version != null) {
1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                versionCode = Integer.parseInt(version);
1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String timeStampStr = parser.getAttributeValue(null, "ft");
1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                long timeStamp = Long.parseLong(timeStampStr, 16);
1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.setTimeStamp(timeStamp);
1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ts");
1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    long timeStamp = Long.parseLong(timeStampStr);
1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ps.setTimeStamp(timeStamp);
1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "it");
1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "ut");
1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = parser.getAttributeValue(null, "userId");
1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ps.userId = idStr != null ? Integer.parseInt(idStr) : 0;
1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (ps.userId <= 0) {
1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            ps.userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("perms")) {
1484447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                readGrantedPermissionsLPw(parser, ps.grantedPermissions);
1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <updated-package>: " + parser.getName());
1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.put(name, ps);
1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = null;
1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String sharedIdStr = null;
1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = null;
1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = null;
1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = null;
1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String systemStr = null;
1503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String installerPackageName = null;
1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String uidError = null;
1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long timeStamp = 0;
1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long firstInstallTime = 0;
1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long lastUpdateTime = 0;
1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSettingBase packageSetting = null;
1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = null;
1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            name = parser.getAttributeValue(null, "name");
1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            realName = parser.getAttributeValue(null, "realName");
1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            uidError = parser.getAttributeValue(null, "uidError");
1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            codePathStr = parser.getAttributeValue(null, "codePath");
1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            version = parser.getAttributeValue(null, "version");
1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (version != null) {
1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    versionCode = Integer.parseInt(version);
1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            installerPackageName = parser.getAttributeValue(null, "installer");
1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            systemStr = parser.getAttributeValue(null, "flags");
1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (systemStr != null) {
1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags = Integer.parseInt(systemStr);
1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // For backward compatibility
1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                systemStr = parser.getAttributeValue(null, "system");
1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (systemStr != null) {
1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            : 0;
1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Old settings that don't specify system... just treat
1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // them as system, good enough.
1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String timeStampStr = parser.getAttributeValue(null, "ft");
1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    timeStamp = Long.parseLong(timeStampStr, 16);
1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                timeStampStr = parser.getAttributeValue(null, "ts");
1556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (timeStampStr != null) {
1557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        timeStamp = Long.parseLong(timeStampStr);
1559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "it");
1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    firstInstallTime = Long.parseLong(timeStampStr, 16);
1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ut");
1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    lastUpdateTime = Long.parseLong(timeStampStr, 16);
1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " sharedUserId=" + sharedIdStr);
1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (resourcePathStr == null) {
1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePathStr = codePathStr;
1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (realName != null) {
1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                realName = realName.intern();
1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no name at "
1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (codePathStr == null) {
1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no codePath at "
1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId > 0) {
1596447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkgFlags);
1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_SETTINGS)
1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " pkg=" + packageSetting);
1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (packageSetting == null) {
1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " while parsing settings at "
1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (sharedIdStr != null) {
1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (userId > 0) {
1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting = new PendingPackage(name.intern(), realName, new File(
1615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            versionCode, pkgFlags);
1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPendingPackages.add((PendingPackage) packageSetting);
1621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_SETTINGS)
1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Log.i(PackageManagerService.TAG, "Reading package " + name
1623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + ": sharedUserId=" + userId + " pkg=" + packageSetting);
1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: package " + name
1627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " has bad sharedId " + sharedIdStr + " at "
1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: package " + name + " has bad userId "
1633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + idStr + " at " + parser.getPositionDescription());
1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
1638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
1639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSetting != null) {
1641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.uidError = "true".equals(uidError);
1642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.installerPackageName = installerPackageName;
1643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String enabledStr = parser.getAttributeValue(null, "enabled");
1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (enabledStr != null) {
1646b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                try {
1647b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    packageSetting.enabled = Integer.parseInt(enabledStr);
1648b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                } catch (NumberFormatException e) {
1649b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    if (enabledStr.equalsIgnoreCase("true")) {
1650b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_ENABLED;
1651b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("false")) {
1652b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_DISABLED;
1653b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("default")) {
1654b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1655b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else {
1656b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        PackageManagerService.reportSettingsProblem(Log.WARN,
1657b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                "Error in package manager settings: package " + name
1658b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + " has bad enabled value: " + idStr + " at "
1659b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + parser.getPositionDescription());
1660b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    }
1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                packageSetting.enabled = COMPONENT_ENABLED_STATE_DEFAULT;
1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String installStatusStr = parser.getAttributeValue(null, "installStatus");
1666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (installStatusStr != null) {
1667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (installStatusStr.equalsIgnoreCase("false")) {
1668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
1669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
1671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1676cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1677cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("disabled-components")) {
1684447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledComponentsLPw(packageSetting, parser);
1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("enabled-components")) {
1686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readEnabledComponentsLPw(packageSetting, parser);
1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("sigs")) {
1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.signatures.readXml(parser, mPastSignatures);
1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
1690447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.permissionsFixed = true;
1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <package>: " + parser.getName());
1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1707cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.disabledComponents.add(name.intern());
1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <disabled-components> has"
1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <disabled-components>: " + parser.getName());
1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1731447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser)
1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1737cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1738cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1739cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1741cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1742cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.enabledComponents.add(name.intern());
1746cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <enabled-components> has"
1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
1750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <enabled-components>: " + parser.getName());
1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1759447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting su = null;
1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            name = parser.getAttributeValue(null, "name");
1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if ("true".equals(parser.getAttributeValue(null, "system"))) {
1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1771cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1773cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <shared-user> has no name at "
1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId == 0) {
1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: shared-user " + name
1778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + " has bad userId " + idStr + " at "
1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1781447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService
1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ;
1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (su != null) {
1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("sigs")) {
1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    su.signatures.readXml(parser, mPastSignatures);
1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
1807447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, su.grantedPermissions);
1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <shared-user>: " + parser.getName());
1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1820447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1826cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1827cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String name = parser.getAttributeValue(null, "name");
1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    outPerms.add(name.intern());
1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <perms> has" + " no name at "
1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <perms>: " + parser.getName());
1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1848447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException,
1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("item")) {
1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity pa = new PreferredActivity(parser);
1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pa.mPref.getParseError() == null) {
1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPreferredActivities.addFilter(pa);
1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <preferred-activity> "
1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + pa.mPref.getParseError() + " at "
1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <preferred-activities>: " + parser.getName());
1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Returns -1 if we could not find an available UserId to assign
1878447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private int newUserIdLPw(Object obj) {
1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Let's be stupidly inefficient for now...
1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mUserIds.size();
1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(i) == null) {
1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.set(i, obj);
1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return PackageManagerService.FIRST_APPLICATION_UID + i;
1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // None left?
1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (N >= PackageManagerService.MAX_APPLICATION_UIDS) {
1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return -1;
1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mUserIds.add(obj);
1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return PackageManagerService.FIRST_APPLICATION_UID + N;
1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1897447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public PackageSetting getDisabledSystemPkgLPr(String name) {
1898447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ps = mDisabledSysPackages.get(name);
1899447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return ps;
1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1902447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean isEnabledLPr(ComponentInfo componentInfo, int flags) {
1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final PackageSetting packageSettings = mPackages.get(componentInfo.packageName);
1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (PackageManagerService.DEBUG_SETTINGS) {
1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = " + componentInfo.packageName
1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + " componentName = " + componentInfo.name);
1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "enabledComponents: "
1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + Arrays.toString(packageSettings.enabledComponents.toArray()));
1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "disabledComponents: "
1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       + Arrays.toString(packageSettings.disabledComponents.toArray()));
1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings == null) {
1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED
19190ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn                || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        && packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.enabledComponents.contains(componentInfo.name)) {
1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings.disabledComponents.contains(componentInfo.name)) {
1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return componentInfo.enabled;
1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1932447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1933447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    String getInstallerPackageNameLPr(String packageName) {
1934447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1935447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1936447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1937447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1938447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.installerPackageName;
1939447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1940447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1941447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int getApplicationEnabledSettingLPr(String packageName) {
1942447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1943447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1944447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1945447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1946447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.enabled;
1947447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1948447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1949447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int getComponentEnabledSettingLPr(ComponentName componentName) {
1950447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String packageName = componentName.getPackageName();
1951447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
1952447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
1953447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown component: " + componentName);
1954447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1955447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String classNameStr = componentName.getClassName();
1956447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.getCurrentEnabledStateLPr(classNameStr);
1957447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1958447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1959447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
1960447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            boolean allowedByPermission, int uid) {
1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkgSetting = mPackages.get(packageName);
1962447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting == null) {
1963447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
1964447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1965447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (!allowedByPermission && (uid != pkgSetting.userId)) {
1966447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new SecurityException(
1967447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Permission Denial: attempt to change stopped state from pid="
1968447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + Binder.getCallingPid()
1969447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + ", uid=" + uid + ", package uid=" + pkgSetting.userId);
1970447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (DEBUG_STOPPED) {
1972447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (stopped) {
1973447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                RuntimeException e = new RuntimeException("here");
1974447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                e.fillInStackTrace();
1975447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                Slog.i(TAG, "Stopping package " + packageName, e);
1976447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
1977447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1978447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting.stopped != stopped) {
1979447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pkgSetting.stopped = stopped;
1980447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pkgSetting.pkg.mSetStopped = stopped;
1981447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (pkgSetting.notLaunched) {
1982447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (pkgSetting.installerPackageName != null) {
1983447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
1984447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.name, null,
1985447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.installerPackageName, null);
1986447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
1987447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pkgSetting.notLaunched = false;
1988447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
1989447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            return true;
1990447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
1991447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return false;
1992447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
1993447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
1994447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
1995447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1996447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Date date = new Date();
1997447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
1998447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (final PackageSetting ps : mPackages.values()) {
1999447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(ps.realName)
2000447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    && !packageName.equals(ps.name)) {
2001447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2002447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2004447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null) {
2005447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                dumpState.setSharedUser(ps.sharedUser);
2006447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2007447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2008447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2009447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2010447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2011447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Packages:");
2012447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2013447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2014447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Package [");
2015447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2017447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2019447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2020447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.realName != null) {
2021447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    compat name=");
2022447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.name);
2023447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2024447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId="); pw.print(ps.userId);
2026447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2027447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sharedUser="); pw.println(ps.sharedUser);
2028447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkg="); pw.println(ps.pkg);
2029447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    codePath="); pw.println(ps.codePathString);
2030447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    resourcePath="); pw.println(ps.resourcePathString);
2031447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2032447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    versionCode="); pw.println(ps.versionCode);
2033447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.pkg != null) {
2034447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    versionName="); pw.println(ps.pkg.mVersionName);
2035447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2036447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2037447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.pkg.mOperationPending) {
2038447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("    mOperationPending=true");
2039447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2040447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    supportsScreens=[");
2041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                boolean first = true;
2042447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2043447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2044447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2045447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2046447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("small");
2047447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2048447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2049447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2051447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2052447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("medium");
2053447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2054447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2055447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2056447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2057447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2058447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("large");
2059447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2060447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2061447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2062447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2063447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2064447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("xlarge");
2065447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2066447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2067447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2068447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2069447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2070447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("resizeable");
2071447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2072447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2074447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2075447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2076447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("anyDensity");
2077447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2078447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2079447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("]");
2080447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    timeStamp=");
2081447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.timeStamp);
2082447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2083447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    firstInstallTime=");
2084447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.firstInstallTime);
2085447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2086447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    lastUpdateTime=");
2087447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.lastUpdateTime);
2088447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2089447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.installerPackageName != null) {
2090447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    installerPackageName="); pw.println(ps.installerPackageName);
2091447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2092447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    signatures="); pw.println(ps.signatures);
2093447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    permissionsFixed="); pw.print(ps.permissionsFixed);
2094447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" haveGids="); pw.println(ps.haveGids);
2095447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
2096447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" installStatus="); pw.print(ps.installStatus);
2097447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" stopped="); pw.print(ps.stopped);
2098447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" enabled="); pw.println(ps.enabled);
2099447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.disabledComponents.size() > 0) {
2100447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    disabledComponents:");
2101447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.disabledComponents) {
2102447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2104447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2105447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.enabledComponents.size() > 0) {
2106447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    enabledComponents:");
2107447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.enabledComponents) {
2108447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2109447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2110447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.grantedPermissions.size() > 0) {
2112447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    grantedPermissions:");
2113447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.grantedPermissions) {
2114447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2115447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2116447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2117447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2118447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2119447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2120447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mRenamedPackages.size() > 0) {
2121447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final HashMap.Entry<String, String> e : mRenamedPackages.entrySet()) {
2122447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(e.getKey())
2123447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(e.getValue())) {
2124447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2125447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2126447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2127447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2128447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2129447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Renamed packages:");
2130447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2131447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2132447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  ");
2133447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(e.getKey());
2134447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(" -> ");
2135447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(e.getValue());
2136447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2137447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2138447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2139447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2140447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mDisabledSysPackages.size() > 0) {
2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting ps : mDisabledSysPackages.values()) {
2142447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(ps.realName)
2143447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(ps.name)) {
2144447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2145447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2146447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2147447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2148447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Hidden system packages:");
2150447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2151447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2152447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  Package [");
2153447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2154447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2155447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2156447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2157447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.realName != null) {
2158447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("    compat name=");
2159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(ps.name);
2160447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    userId=");
2162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.userId);
2163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    sharedUser=");
2164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.sharedUser);
2165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    codePath=");
2166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.codePathString);
2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    resourcePath=");
2168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.resourcePathString);
2169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2171447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2172447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2175447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (BasePermission p : mPermissions.values()) {
2176447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(p.sourcePackage)) {
2177447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2178447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2181447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2182447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Permissions:");
2183447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2184447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2185447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Permission ["); pw.print(p.name); pw.print("] (");
2186447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(Integer.toHexString(System.identityHashCode(p)));
2187447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2188447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sourcePackage="); pw.println(p.sourcePackage);
2189447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    uid="); pw.print(p.uid);
2190447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2191447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" type="); pw.print(p.type);
2192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" prot="); pw.println(p.protectionLevel);
2193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.packageSetting != null) {
2194447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    packageSetting="); pw.println(p.packageSetting);
2195447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.perm != null) {
2197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    perm="); pw.println(p.perm);
2198447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2199447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2200447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2202447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2204447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (SharedUserSetting su : mSharedUsers.values()) {
2205447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && su != dumpState.getSharedUser()) {
2206447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2207447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2209447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2210447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Shared users:");
2212447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2213447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2214447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  SharedUser [");
2215447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.name);
2216447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("] (");
2217447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(Integer.toHexString(System.identityHashCode(su)));
2218447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2219447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId=");
2220447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.userId);
2221447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids=");
2222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println(PackageManagerService.arrayToString(su.gids));
2223447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("    grantedPermissions:");
2224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (String s : su.grantedPermissions) {
2225447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("      ");
2226447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(s);
2227447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2228447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2229447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2230447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2231447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2232447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.println("Settings parse messages:");
2233447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.print(mReadMessages.toString());
2234447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root}