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;
231c27576aff247ff1d7789e0a571958726f161593Jeff Sharkeyimport static android.Manifest.permission.READ_EXTERNAL_STORAGE;
24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.FastXmlSerializer;
26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.JournaledFile;
27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.internal.util.XmlUtils;
28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport com.android.server.IntentResolver;
29447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport com.android.server.pm.PackageManagerService.DumpState;
30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParser;
32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlPullParserException;
33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport org.xmlpull.v1.XmlSerializer;
34cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
35483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.app.AppGlobals;
36447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName;
37447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent;
38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo;
39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo;
40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager;
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser;
42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo;
43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature;
44483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.content.pm.UserInfo;
450aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity;
46447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder;
47cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment;
48cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils;
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process;
50483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.os.RemoteException;
51483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.os.UserId;
52cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log;
53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog;
54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray;
55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml;
56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream;
58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream;
60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream;
61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException;
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter;
63447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat;
64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList;
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays;
66447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date;
67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap;
68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator;
70483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport java.util.List;
712f36229db823d152f3efd879e751e81a601a75b0Andy McFaddenimport java.util.Map;
72cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
7362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils;
7462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root
75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
76cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings.
77cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings {
79447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final String TAG = "PackageSettings";
80447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
81447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final boolean DEBUG_STOPPED = false;
82447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
83edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey    private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
84edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey    private static final String ATTR_ENFORCEMENT = "enforcement";
85edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
86483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_ITEM = "item";
87483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
88483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
89483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
90483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_PACKAGE = "pkg";
91483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
92483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_NAME = "name";
93483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_NOT_LAUNCHED = "nl";
94483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_ENABLED = "enabled";
95483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_STOPPED = "stopped";
96483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
97cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mSettingsFilename;
98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupSettingsFilename;
99cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mPackageListFilename;
100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mStoppedPackagesFilename;
101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupStoppedPackagesFilename;
102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mPackages =
103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, PackageSetting>();
104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // List of replaced system applications
105c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    private final HashMap<String, PackageSetting> mDisabledSysPackages =
106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        new HashMap<String, PackageSetting>();
107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // These are the last platform API version we were using for
109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // the apps installed on internal and external storage.  It is
110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // used to grant newer permissions one time during a system upgrade.
111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mInternalSdkPlatform;
112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mExternalSdkPlatform;
1130aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
114f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey    Boolean mReadExternalStorageEnforced;
115edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
1160aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    /** Device identity for the purpose of package verification. */
1170aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    private VerifierDeviceIdentity mVerifierDeviceIdentity;
1180aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // The user's preferred activities associated with particular intent
120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // filters.
121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new IntentResolver<PreferredActivity, PreferredActivity>() {
123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected String packageForFilter(PreferredActivity filter) {
125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return filter.mPref.mComponent.getPackageName();
126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        @Override
128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        protected void dumpFilter(PrintWriter out, String prefix,
129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity filter) {
130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            filter.mPref.dump(out, prefix, filter);
131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    };
133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, SharedUserSetting> mSharedUsers =
134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, SharedUserSetting>();
135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Object> mUserIds = new ArrayList<Object>();
136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final SparseArray<Object> mOtherUserIds =
137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new SparseArray<Object>();
138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // For reading/writing settings file.
140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Signature> mPastSignatures =
141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new ArrayList<Signature>();
142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission names to info about them.
144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissions =
145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission tree names to info about them.
148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissionTrees =
149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been uninstalled and still need their external
152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // storage data deleted.
153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final ArrayList<String> mPackagesToBeCleaned = new ArrayList<String>();
154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been renamed since they were first installed.
156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Keys are the new names of the packages, values are the original
157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.  The packages appear everwhere else under their original
158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.
159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final StringBuilder mReadMessages = new StringBuilder();
162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    /**
164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * Used to track packages that have a shared user ID that hasn't been read
165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * in yet.
166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * <p>
167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * TODO: make this just a local variable that is passed in during package
168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * scanning to make it less confusing.
169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     */
170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
172483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private final File mSystemDir;
173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    Settings() {
174483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        this(Environment.getDataDirectory());
175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
177483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    Settings(File dataDir) {
178483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSystemDir = new File(dataDir, "system");
179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSystemDir.mkdirs();
180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        FileUtils.setPermissions(mSystemDir.toString(),
181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.S_IRWXU|FileUtils.S_IRWXG
182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                |FileUtils.S_IROTH|FileUtils.S_IXOTH,
183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                -1, -1);
184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSettingsFilename = new File(mSystemDir, "packages.xml");
185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
186483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mPackageListFilename = new File(mSystemDir, "packages.list");
187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // Deprecated: Needed for migration
188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
192447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int pkgFlags, boolean create, boolean add) {
195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String name = pkg.packageName;
196447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags, create, add);
198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
201447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting peekPackageLPr(String name) {
202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return mPackages.get(name);
203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallStatus(String pkgName, int status) {
206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if(p.getInstallStatus() != status) {
209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setInstallStatus(status);
210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallerPackageName(String pkgName,
215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String installerPkgName) {
216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.setInstallerPackageName(installerPkgName);
219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
222447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting getSharedUserLPw(String name,
223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int pkgFlags, boolean create) {
224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s == null) {
226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            s = new SharedUserSetting(name, pkgFlags);
23021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            s.userId = newUserIdLPw(s);
231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // < 0 means we couldn't assign a userid; fall out and return
233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // s, which is currently null
234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId >= 0) {
235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSharedUsers.put(name, s);
236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return s;
240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
242447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean disableSystemPackageLPw(String name) {
243447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
248447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting dp = mDisabledSysPackages.get(name);
249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // always make sure the system package code and resource paths dont change
250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (dp == null) {
251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mDisabledSysPackages.put(name, p);
255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // a little trick...  when we install the new package, we don't
257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // want to modify the existing PackageSetting for the built-in
258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // version.  so at this point we need a new PackageSetting that
259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // is okay to muck with.
260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageSetting newp = new PackageSetting(p);
261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            replacePackageLPw(name, newp);
262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return false;
265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting enableSystemPackageLPw(String name) {
268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mDisabledSysPackages.get(name);
269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Reset flag in ApplicationInfo object
274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
277447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
278135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                p.nativeLibraryPathString, p.appId, p.versionCode, p.pkgFlags);
279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.remove(name);
280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
283c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    boolean isDisabledSystemPackageLPr(String name) {
284c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root        return mDisabledSysPackages.containsKey(name);
285c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    }
286c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root
287c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    void removeDisabledSystemPackageLPw(String name) {
288c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root        mDisabledSysPackages.remove(name);
289c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    }
290c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root
291447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
295135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (p.appId == uid) {
296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p;
297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate package, keeping first: " + name);
300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                vc, pkgFlags);
304135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        p.appId = uid;
305447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, p, name)) {
306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.put(name, p);
307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return p;
308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
312447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s != null) {
315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId == uid) {
316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return s;
317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate shared user, keeping first: " + name);
320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s = new SharedUserSetting(name, pkgFlags);
323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s.userId = uid;
324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, s, name)) {
325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mSharedUsers.put(name, s);
326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return s;
327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Transfer ownership of permissions from one package to another.
332447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void transferPermissionsLPw(String origPkg, String newPkg) {
333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Transfer ownership of permissions to the new package.
334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i=0; i<2; i++) {
335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            HashMap<String, BasePermission> permissions =
336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    i == 0 ? mPermissionTrees : mPermissions;
337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : permissions.values()) {
338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (origPkg.equals(bp.sourcePackage)) {
339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Moving permission " + bp.name
341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " from pkg " + bp.sourcePackage
342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + newPkg);
343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.sourcePackage = newPkg;
344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.packageSetting = null;
345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.perm = null;
346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (bp.pendingInfo != null) {
347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo.packageName = newPkg;
348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.uid = 0;
350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.gids = null;
351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
355483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {
359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!p.codePath.equals(codePath)) {
362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Check to see if its a disabled system app
363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // This is an updated system app with versions in both system
365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // and data partition. Just let the most recent version
366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // take precedence.
367483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Trying to update system app code path from "
368483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + p.codePathString + " to " + codePath.toString());
369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Just a change in the code path is not an issue, but
371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // let's log a message about it.
372483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from "
373483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + p.codePath + " to " + codePath + "; Retaining data and using new");
374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    /*
375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * Since we've changed paths, we need to prefer the new
376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * native library path over the one stored in the
377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * package settings since we might have moved from
378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * internal to external storage or vice versa.
379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     */
380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.nativeLibraryPathString = nativeLibraryPathString;
381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != sharedUser) {
384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " shared user changed from "
386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " to "
388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (sharedUser != null ? sharedUser.name : "<nothing>")
389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; replacing with new");
390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = null;
391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If what we are scanning is a system package, then
394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // make it so, regardless of whether it was previously
395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // installed only in the data partition.
396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p == null) {
401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Create a new PackageSettings entry. this can end up here because
402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // of code path mismatch or user id mismatch of an updated system partition
403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (origPackage != null) {
407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We are consuming the data from an existing package.
408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
410483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
411483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + name + " is adopting original package " + origPackage.name);
412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Note that we will retain the new package's signature so
413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // that we can keep its data.
414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageSignatures s = p.signatures;
415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(origPackage);
416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.signatures = s;
417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = origPackage.sharedUser;
418135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                p.appId = origPackage.appId;
419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.origPackage = origPackage;
420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mRenamedPackages.put(name, origPackage.name);
421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                name = origPackage.name;
422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Update new package state.
423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(name, realName, codePath, resourcePath,
426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = sharedUser;
429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is not a system app, it starts out stopped.
430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (DEBUG_STOPPED) {
432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        RuntimeException e = new RuntimeException("here");
433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        e.fillInStackTrace();
434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
436483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    List<UserInfo> users = getAllUsers();
437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (users != null) {
438483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        for (UserInfo user : users) {
439483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            p.setStopped(true, user.id);
440483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            p.setNotLaunched(true, user.id);
441483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            writePackageRestrictionsLPr(user.id);
442483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
443483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (sharedUser != null) {
446135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    p.appId = sharedUser.userId;
44721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn                } else {
448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Clone the setting here for disabled system packages
449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting dis = mDisabledSysPackages.get(name);
450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dis != null) {
451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // For disabled packages a new setting is created
452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // from the existing user id. This still has to be
453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // added to list of user id's
454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Copy signatures from previous setting
455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (dis.signatures.mSignatures != null) {
456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.signatures.mSignatures = dis.signatures.mSignatures.clone();
457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
458135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        p.appId = dis.appId;
459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone permissions
460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone component info
462483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        List<UserInfo> users = getAllUsers();
463483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (users != null) {
464483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            for (UserInfo user : users) {
465483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                int userId = user.id;
466483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                p.setDisabledComponents(
467483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        new HashSet<String>(dis.getDisabledComponents(userId)),
468483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        userId);
469483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                p.setEnabledComponents(
470483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        new HashSet<String>(dis.getEnabledComponents(userId)),
471483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                        userId);
472483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            }
473483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Add new setting to list of user ids
475135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        addUserIdLPw(p.appId, p, name);
476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Assign new user id
478135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        p.appId = newUserIdLPw(p);
479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
482135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (p.appId < 0) {
483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " could not be assigned a valid uid");
485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (add) {
488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Finish adding new package by adding it and updating shared
489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // user preferences
490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                addPackageSettingLPw(p, name, sharedUser);
491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
496447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.pkg = pkg;
498483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // pkg.mSetEnabled = p.getEnabled(userId);
499483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // pkg.mSetStopped = p.getStopped(userId);
500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String codePath = pkg.applicationInfo.sourceDir;
501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String resourcePath = pkg.applicationInfo.publicSourceDir;
502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update code path if needed
503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!codePath.equalsIgnoreCase(p.codePathString)) {
504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.codePathString + " to " + codePath);
506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePath = new File(codePath);
507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePathString = codePath;
508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Update resource path if needed
510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.resourcePathString + " to " + resourcePath);
513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePath = new File(resourcePath);
514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePathString = resourcePath;
515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update the native library path if needed
517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (nativeLibraryPath != null
519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.nativeLibraryPathString = nativeLibraryPath;
521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update version code if needed
523483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (pkg.mVersionCode != p.versionCode) {
524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.versionCode = pkg.mVersionCode;
525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
526483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // Update signatures if needed.
527483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (p.signatures.mSignatures == null) {
528483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            p.signatures.assignSignatures(pkg.mSignatures);
529483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
530483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // If this app defines a shared user id initialize
531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // the shared user signatures as well.
532483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
533483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
534483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
535447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Utility method that adds a PackageSetting to mPackages and
539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // completes updating the shared user attributes
540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void addPackageSettingLPw(PackageSetting p, String name,
541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            SharedUserSetting sharedUser) {
542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, p);
543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (sharedUser != null) {
544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null && p.sharedUser != sharedUser) {
545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + p.name + " was user "
547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + p.sharedUser + " but is now " + sharedUser
548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; I am not changing its files so it will probably fail!");
549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
550135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            } else if (p.appId != sharedUser.userId) {
551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
552135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    "Package " + p.name + " was user id " + p.appId
553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " but is now user " + sharedUser
554cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " with id " + sharedUser.userId
555cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "; I am not changing its files so it will probably fail!");
556cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
557cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
558cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedUser.packages.add(p);
559cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.sharedUser = sharedUser;
560135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            p.appId = sharedUser.userId;
561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /*
565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Update the shared user setting when a package using
566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * specifying the shared user id is removed. The gids
567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * associated with each permission of the deleted package
568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * are removed from the shared user's gid list only if its
569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * not in use by other permissions of packages in the
570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * shared user setting.
571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if ((deletedPs == null) || (deletedPs.pkg == null)) {
574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Slog.i(PackageManagerService.TAG,
575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Trying to update info for null package. Just ignoring");
576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // No sharedUserId
579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (deletedPs.sharedUser == null) {
580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting sus = deletedPs.sharedUser;
583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update permissions
584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (String eachPerm : deletedPs.pkg.requestedPermissions) {
585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            boolean used = false;
586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!sus.grantedPermissions.contains(eachPerm)) {
587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (PackageSetting pkg:sus.packages) {
590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.pkg != null &&
591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.pkg.requestedPermissions.contains(eachPerm)) {
593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    used = true;
594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    break;
595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!used) {
598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // can safely delete this permission from list
599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                sus.grantedPermissions.remove(eachPerm);
600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update gids
603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int newGids[] = globalGids;
604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (String eachPerm : sus.grantedPermissions) {
605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BasePermission bp = mPermissions.get(eachPerm);
606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp != null) {
607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                newGids = PackageManagerService.appendInts(newGids, bp.gids);
608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        sus.gids = newGids;
611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int removePackageLPw(String name) {
614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.remove(name);
617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p.sharedUser.packages.size() == 0) {
620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSharedUsers.remove(p.sharedUser.name);
621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    removeUserIdLPw(p.sharedUser.userId);
622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return p.sharedUser.userId;
623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
625135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                removeUserIdLPw(p.appId);
626135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                return p.appId;
627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return -1;
630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
632447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replacePackageLPw(String name, PackageSetting newp) {
633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.add(newp);
638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
639135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                replaceUserIdLPw(p.appId, newp);
640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, newp);
643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
645447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private boolean addUserIdLPw(int uid, Object obj, Object name) {
64621fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid > Process.LAST_APPLICATION_UID) {
647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
65021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int N = mUserIds.size();
65221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while (index >= N) {
654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.add(null);
655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                N++;
656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(index) != null) {
658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate user id: " + uid
660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mUserIds.set(index, obj);
664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mOtherUserIds.get(uid) != null) {
666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate shared id: " + uid
668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public Object getUserIdLPr(int uid) {
67721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
67921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return index < N ? mUserIds.get(index) : null;
681cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return mOtherUserIds.get(uid);
683cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void removeUserIdLPw(int uid) {
68721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
68921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, null);
691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.remove(uid);
693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
696447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replaceUserIdLPw(int uid, Object obj) {
69721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
69921fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, obj);
701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
706483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private File getUserPackagesStateFile(int userId) {
707483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return new File(mSystemDir,
708483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                "users/" + userId + "/package-restrictions.xml");
709483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
710483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
711483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private File getUserPackagesStateBackupFile(int userId) {
712483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return new File(mSystemDir,
713483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                "users/" + userId + "/package-restrictions-backup.xml");
714483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
715483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
716483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void writeAllUsersPackageRestrictionsLPr() {
717483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        List<UserInfo> users = getAllUsers();
718483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (users == null) return;
719483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
720483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        for (UserInfo user : users) {
721483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            writePackageRestrictionsLPr(user.id);
722483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
723483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
724483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
725483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void readAllUsersPackageRestrictionsLPr() {
726483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        List<UserInfo> users = getAllUsers();
727483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (users == null) {
728483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            readPackageRestrictionsLPr(0);
729483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            return;
730483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
731483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
732483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        for (UserInfo user : users) {
733483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            readPackageRestrictionsLPr(user.id);
734483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
735483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
736483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
737483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void readPackageRestrictionsLPr(int userId) {
738483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        FileInputStream str = null;
739483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File userPackagesStateFile = getUserPackagesStateFile(userId);
740483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File backupFile = getUserPackagesStateBackupFile(userId);
741483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (backupFile.exists()) {
742483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            try {
743483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                str = new FileInputStream(backupFile);
744483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                mReadMessages.append("Reading from backup stopped packages file\n");
745483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.INFO,
746483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "Need to read from backup stopped packages file");
747483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (userPackagesStateFile.exists()) {
748483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // If both the backup and normal file exist, we
749483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // ignore the normal one since it might have been
750483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // corrupted.
751483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
752483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + userPackagesStateFile);
753483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    userPackagesStateFile.delete();
754483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
755483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            } catch (java.io.IOException e) {
756483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                // We'll try for the normal settings file.
757483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
758483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
759483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
760483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        try {
761483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (str == null) {
762483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (!userPackagesStateFile.exists()) {
763483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    mReadMessages.append("No stopped packages file found\n");
764483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    PackageManagerService.reportSettingsProblem(Log.INFO,
765483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            "No stopped packages file; "
766483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + "assuming all started");
767483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // At first boot, make sure no packages are stopped.
768483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // We usually want to have third party apps initialize
769483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // in the stopped state, but not at first boot.
770483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    for (PackageSetting pkg : mPackages.values()) {
771483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setStopped(false, userId);
772483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setNotLaunched(false, userId);
773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
774483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    return;
775483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
776483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                str = new FileInputStream(userPackagesStateFile);
777483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
778483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final XmlPullParser parser = Xml.newPullParser();
779483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            parser.setInput(str, null);
780483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
781483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int type;
782483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            while ((type=parser.next()) != XmlPullParser.START_TAG
783483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                       && type != XmlPullParser.END_DOCUMENT) {
784483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                ;
785483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
786483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
787483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (type != XmlPullParser.START_TAG) {
788483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                mReadMessages.append("No start tag found in package restrictions file\n");
789483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.WARN,
790483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "No start tag found in package manager stopped packages");
791483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                return;
792483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
793483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
794483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int outerDepth = parser.getDepth();
795483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageSetting ps = null;
796483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
797483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                   && (type != XmlPullParser.END_TAG
798483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                           || parser.getDepth() > outerDepth)) {
799483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (type == XmlPullParser.END_TAG
800483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        || type == XmlPullParser.TEXT) {
801483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    continue;
802483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
803483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
804483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String tagName = parser.getName();
805483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_PACKAGE)) {
806483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
807483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    ps = mPackages.get(name);
808483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (ps == null) {
809483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        Slog.w(PackageManagerService.TAG, "No package known for stopped package: "
810483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                + name);
811483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        XmlUtils.skipCurrentTag(parser);
812483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        continue;
813483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
814483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
815483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    int enabled = enabledStr == null ? COMPONENT_ENABLED_STATE_DEFAULT
816483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            : Integer.parseInt(enabledStr);
817483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    ps.setEnabled(enabled, userId);
818483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED);
819483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    boolean stopped = stoppedStr == null ? false : Boolean.parseBoolean(stoppedStr);
820483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    ps.setStopped(stopped, userId);
821483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED);
822483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    boolean notLaunched = stoppedStr == null ? false
823483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            : Boolean.parseBoolean(notLaunchedStr);
824483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    ps.setNotLaunched(notLaunched, userId);
825483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
826483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    int packageDepth = parser.getDepth();
827483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
828483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            && (type != XmlPullParser.END_TAG
829483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            || parser.getDepth() > packageDepth)) {
830483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (type == XmlPullParser.END_TAG
831483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                || type == XmlPullParser.TEXT) {
832483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            continue;
833483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
834483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        tagName = parser.getName();
835483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
836483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            HashSet<String> components = readComponentsLPr(parser);
837483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            ps.setEnabledComponents(components, userId);
838483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
839483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            HashSet<String> components = readComponentsLPr(parser);
840483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            ps.setDisabledComponents(components, userId);
841483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
842483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
843483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                } else {
844483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
845483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                          + parser.getName());
846483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    XmlUtils.skipCurrentTag(parser);
847483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
848483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
849483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
850483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            str.close();
851483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
852483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (XmlPullParserException e) {
853483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mReadMessages.append("Error reading: " + e.toString());
854483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR,
855483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Error reading stopped packages: " + e);
856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
858483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (java.io.IOException e) {
859483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mReadMessages.append("Error reading: " + e.toString());
860483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
861483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
862483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
863483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
864483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
865483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private HashSet<String> readComponentsLPr(XmlPullParser parser)
866483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            throws IOException, XmlPullParserException {
867483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        HashSet<String> components = new HashSet<String>();
868483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int type;
869483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int outerDepth = parser.getDepth();
870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        String tagName;
871483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
872483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                && (type != XmlPullParser.END_TAG
873483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                || parser.getDepth() > outerDepth)) {
874483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (type == XmlPullParser.END_TAG
875483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    || type == XmlPullParser.TEXT) {
876483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                continue;
877483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
878483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            tagName = parser.getName();
879483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
880483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String componentName = parser.getAttributeValue(null, ATTR_NAME);
881483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (componentName != null) {
882483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    components.add(componentName);
883483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
884483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
885483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
886483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return components;
887483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
888483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
889483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void writePackageRestrictionsLPr(int userId) {
890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old stopped packages around until we know the new ones have
891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
892483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File userPackagesStateFile = getUserPackagesStateFile(userId);
893483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File backupFile = getUserPackagesStateBackupFile(userId);
894483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        new File(userPackagesStateFile.getParent()).mkdirs();
895483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (userPackagesStateFile.exists()) {
896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist packages earlier. So preserve the older
898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current packages
899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
900483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (!backupFile.exists()) {
901483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (!userPackagesStateFile.renameTo(backupFile)) {
902483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, "
903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "current changes will be lost at reboot");
904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
907483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                userPackagesStateFile.delete();
908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
913483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
914447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final BufferedOutputStream str = new BufferedOutputStream(fstr);
915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
916447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlSerializer serializer = new FastXmlSerializer();
917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
921483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
923447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
924483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (pkg.getStopped(userId)
925483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        || pkg.getNotLaunched(userId)
926483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        || pkg.getEnabled(userId) != COMPONENT_ENABLED_STATE_DEFAULT
927483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        || pkg.getEnabledComponents(userId).size() > 0
928483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        || pkg.getDisabledComponents(userId).size() > 0) {
929483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_PACKAGE);
930483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, pkg.name);
931483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    boolean stopped = pkg.getStopped(userId);
932483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    boolean notLaunched = pkg.getNotLaunched(userId);
933483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    int enabled = pkg.getEnabled(userId);
934483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    HashSet<String> enabledComponents = pkg.getEnabledComponents(userId);
935483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    HashSet<String> disabledComponents = pkg.getDisabledComponents(userId);
936483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
937483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (stopped) {
938483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.attribute(null, ATTR_STOPPED, "true");
939483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
940483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (notLaunched) {
941483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
942483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
943483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
944483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.attribute(null, ATTR_ENABLED, Integer.toString(enabled));
945483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
946483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (enabledComponents.size() > 0) {
947483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.startTag(null, TAG_ENABLED_COMPONENTS);
948483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        for (final String name : enabledComponents) {
949483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.startTag(null, TAG_ITEM);
950483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.attribute(null, ATTR_NAME, name);
951483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.endTag(null, TAG_ITEM);
952483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
953483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.endTag(null, TAG_ENABLED_COMPONENTS);
954483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
955483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (disabledComponents.size() > 0) {
956483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.startTag(null, TAG_DISABLED_COMPONENTS);
957483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        for (final String name : disabledComponents) {
958483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.startTag(null, TAG_ITEM);
959483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.attribute(null, ATTR_NAME, name);
960483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.endTag(null, TAG_ITEM);
961483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
962483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.endTag(null, TAG_DISABLED_COMPONENTS);
963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
964483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_PACKAGE);
965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
968483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
978483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            backupFile.delete();
979483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            FileUtils.setPermissions(userPackagesStateFile.toString(),
980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
98170522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Done, all is good!
985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
987483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG,
988483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Unable to write package manager user packages state, "
989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " current changes will be lost at reboot", e);
990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
993483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (userPackagesStateFile.exists()) {
994483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (!userPackagesStateFile.delete()) {
995483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
996483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + mStoppedPackagesFilename);
997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Note: assumed "stopped" field is already cleared in all packages.
1002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
1003447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void readStoppedLPw() {
1004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupStoppedPackagesFilename.exists()) {
1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupStoppedPackagesFilename);
1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup stopped packages file\n");
1009483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.INFO,
1010483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "Need to read from backup stopped packages file");
1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and normal file exist, we
1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the normal one since it might have been
1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mStoppedPackagesFilename);
1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mStoppedPackagesFilename.delete();
1018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.exists()) {
1027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No stopped packages file found\n");
1028483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    PackageManagerService.reportSettingsProblem(Log.INFO,
1029483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            "No stopped packages file file; assuming all started");
1030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // At first boot, make sure no packages are stopped.
1031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We usually want to have third party apps initialize
1032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // in the stopped state, but not at first boot.
1033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    for (PackageSetting pkg : mPackages.values()) {
1034483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setStopped(false, 0);
1035483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setNotLaunched(false, 0);
1036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
1038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mStoppedPackagesFilename);
1040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1041447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlPullParser parser = Xml.newPullParser();
1042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.START_TAG
1046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       && type != XmlPullParser.END_DOCUMENT) {
1047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in stopped packages file\n");
1052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager stopped packages");
1054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return;
1055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                   && (type != XmlPullParser.END_TAG
1060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                           || parser.getDepth() > outerDepth)) {
1061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG
1062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        || type == XmlPullParser.TEXT) {
1063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1067483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_PACKAGE)) {
1068483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting ps = mPackages.get(name);
1070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (ps != null) {
1071483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        ps.setStopped(true, 0);
1072483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
1073483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            ps.setNotLaunched(true, 0);
1074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
1076483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        Slog.w(PackageManagerService.TAG,
1077483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                "No package known for stopped package: " + name);
1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                          + parser.getName());
1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1089483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (XmlPullParserException e) {
1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1091483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR,
1092483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Error reading stopped packages: " + e);
1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1095483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (java.io.IOException e) {
1096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1103447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeLPr() {
1104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old settings around until we know the new ones have
1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
1110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist settings earlier. So preserve the older
1111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current settings
1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupSettingsFilename.exists()) {
1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " current changes will be lost at reboot");
1117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
1118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSettingsFilename.delete();
1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BufferedOutputStream str = new BufferedOutputStream(fstr);
1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlSerializer serializer = new FastXmlSerializer();
1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "packages");
1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "last-platform-version");
1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
1142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "last-platform-version");
1143edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
11440aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            if (mVerifierDeviceIdentity != null) {
11450aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.startTag(null, "verifier");
11460aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
11470aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.endTag(null, "verifier");
11480aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            }
11490aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
1150f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey            if (mReadExternalStorageEnforced != null) {
1151edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
1152edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.attribute(
11535d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                        null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
1154edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
1155edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey            }
1156edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permission-trees");
1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissionTrees.values()) {
1159447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permission-trees");
1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permissions");
1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissions.values()) {
1165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permissions");
1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1169447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
1170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePackageLPr(serializer, pkg);
1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1173447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mDisabledSysPackages.values()) {
1174447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writeDisabledSysPackageLPr(serializer, pkg);
1175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1177fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            writePreferredActivitiesLPr(serializer);
1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1179447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final SharedUserSetting usr : mSharedUsers.values()) {
1180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "shared-user");
1181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                serializer.attribute(null, ATTR_NAME, usr.name);
1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "userId",
1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Integer.toString(usr.userId));
1184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
1185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "perms");
1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (String name : usr.grantedPermissions) {
1187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "perms");
1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "shared-user");
1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mPackagesToBeCleaned.size() > 0) {
1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (int i=0; i<mPackagesToBeCleaned.size(); i++) {
1197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "cleaning-package");
1198483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, mPackagesToBeCleaned.get(i));
1199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "cleaning-package");
1200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mRenamedPackages.size() > 0) {
12042f36229db823d152f3efd879e751e81a601a75b0Andy McFadden                for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "renamed-package");
1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "new", e.getKey());
1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "old", e.getValue());
1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "renamed-package");
1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "packages");
1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupSettingsFilename.delete();
1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mSettingsFilename.toString(),
1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
122570522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Write package list file now, use a JournaledFile.
1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //
1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            File tempFile = new File(mPackageListFilename.toString() + ".tmp");
1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            fstr = new FileOutputStream(journal.chooseForWrite());
1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str = new BufferedOutputStream(fstr);
1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                StringBuilder sb = new StringBuilder();
1237447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (final PackageSetting pkg : mPackages.values()) {
1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ApplicationInfo ai = pkg.pkg.applicationInfo;
1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String dataPath = ai.dataDir;
1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    boolean isDebug  = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Avoid any application that has a space in its path
1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // or that is handled by the system.
1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID)
1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        continue;
1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // we store on each line the following information for now:
1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // pkgName    - package name
1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // userId     - application-specific user id
1251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // debugFlag  - 0 or 1 if the package is debuggable.
1252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // dataPath   - path to package's data path
1253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // NOTE: We prefer not to expose all ApplicationInfo flags for now.
1255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
1257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
1258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //   system/core/run-as/run-as.c
1259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.setLength(0);
1261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(ai.packageName);
1262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(" ");
1263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append((int)ai.uid);
1264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(isDebug ? " 1 " : " 0 ");
1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(dataPath);
1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append("\n");
1267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    str.write(sb.toString().getBytes());
1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.flush();
1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.sync(fstr);
1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.close();
1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.commit();
127362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root            } catch (Exception e) {
127462539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root                IoUtils.closeQuietly(str);
1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.rollback();
1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mPackageListFilename.toString(),
1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
128070522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
1281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1283483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            writeAllUsersPackageRestrictionsLPr();
1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
1285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
1287cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
1294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mSettingsFilename.delete()) {
1296483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
1297483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + mSettingsFilename);
1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.stopMethodTracing();
1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1303fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn    void writePreferredActivitiesLPr(XmlSerializer serializer)
1304fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            throws IllegalArgumentException, IllegalStateException, IOException {
1305fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        serializer.startTag(null, "preferred-activities");
1306fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        for (final PreferredActivity pa : mPreferredActivities.filterSet()) {
1307fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            serializer.startTag(null, TAG_ITEM);
1308fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            pa.writeToXml(serializer);
1309fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            serializer.endTag(null, TAG_ITEM);
1310fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1311fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        serializer.endTag(null, "preferred-activities");
1312fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn    }
1313fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "updated-package");
1317483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        serializer.attribute(null, ATTR_NAME, pkg.name);
1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1333135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "userId", Integer.toString(pkg.appId));
1334cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1335135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "perms");
1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // If this is a shared user, the permissions will
1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be written there. We still need to write an
1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // empty permissions list so permissionsFixed will
1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be set.
1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.grantedPermissions) {
1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                BasePermission bp = mPermissions.get(name);
1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (bp != null) {
1346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We only need to write signature or system permissions but
1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // this wont
1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // match the semantics of grantedPermissions. So write all
1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // permissions.
1350483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1351483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1352483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "perms");
1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "updated-package");
1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1360447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "package");
1363483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        serializer.attribute(null, ATTR_NAME, pkg.name);
1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1380135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "userId", Integer.toString(pkg.appId));
1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1382135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
1383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.uidError) {
1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "uidError", "true");
1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installStatus", "false");
1389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installerPackageName != null) {
1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installer", pkg.installerPackageName);
1392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "perms");
1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (pkg.sharedUser == null) {
1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is a shared user, the permissions will
1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be written there. We still need to write an
1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // empty permissions list so permissionsFixed will
1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be set.
1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (final String name : pkg.grantedPermissions) {
1402483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1403483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1404483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "perms");
1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "package");
1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1413447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws XmlPullParserException, java.io.IOException {
1415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
1416483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.startTag(null, TAG_ITEM);
1417483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.attribute(null, ATTR_NAME, bp.name);
1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "package", bp.sourcePackage);
1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + bp.type);
1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.type == BasePermission.TYPE_DYNAMIC) {
1426447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pi != null) {
1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "type", "dynamic");
1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.icon != 0) {
1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "icon", Integer.toString(pi.icon));
1431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.nonLocalizedLabel != null) {
1433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.endTag(null, TAG_ITEM);
1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1442447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Iterator<String> its = kList.iterator();
1444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while (its.hasNext()) {
1446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String key = its.next();
1447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final PackageSetting ps = mPackages.get(key);
1448cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1449cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ret.add(ps);
1450cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1455483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean readLPw(List<UserInfo> users) {
1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupSettingsFilename.exists()) {
1458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupSettingsFilename);
1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup settings file\n");
1461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO,
1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Need to read from backup settings file");
1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and settings file exist, we
1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the settings since it might have been
1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mSettingsFilename);
1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSettingsFilename.delete();
1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1476447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        mPendingPackages.clear();
1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1478cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1480cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.exists()) {
1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No settings file found\n");
1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO,
1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "No settings file; creating initial state");
1485fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    readDefaultPreferredAppsLPw();
1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return false;
1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mSettingsFilename);
1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlPullParser parser = Xml.newPullParser();
1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.START_TAG
1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && type != XmlPullParser.END_DOCUMENT) {
1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1500cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in settings file\n");
1501cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1502cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager settings");
150358f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                Log.wtf(PackageManagerService.TAG,
150458f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                        "No start tag found in package manager settings");
1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1511cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1514cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1515cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("package")) {
1517447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPackageLPw(parser);
1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permissions")) {
1519447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissions, parser);
1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permission-trees")) {
1521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissionTrees, parser);
1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("shared-user")) {
1523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readSharedUserLPw(parser);
1524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-packages")) {
1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // no longer used.
1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-activities")) {
1527447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPreferredActivitiesLPw(parser);
1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("updated-package")) {
1529447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledSysPackageLPw(parser);
1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("cleaning-package")) {
1531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (name != null) {
1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mPackagesToBeCleaned.add(name);
1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("renamed-package")) {
1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String nname = parser.getAttributeValue(null, "new");
1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String oname = parser.getAttributeValue(null, "old");
1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (nname != null && oname != null) {
1539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mRenamedPackages.put(nname, oname);
1540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("last-platform-version")) {
1542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mInternalSdkPlatform = mExternalSdkPlatform = 0;
1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String internal = parser.getAttributeValue(null, "internal");
1545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (internal != null) {
1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mInternalSdkPlatform = Integer.parseInt(internal);
1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String external = parser.getAttributeValue(null, "external");
1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (external != null) {
1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mExternalSdkPlatform = Integer.parseInt(external);
1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1553cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
15540aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                } else if (tagName.equals("verifier")) {
15550aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    final String deviceIdentity = parser.getAttributeValue(null, "device");
15560aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    try {
15570aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
15580aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    } catch (IllegalArgumentException e) {
15590aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
15600aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                                + e.getMessage());
15610aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    }
1562edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
1563edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                    final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
15645d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                    mReadExternalStorageEnforced = "1".equals(enforcement);
1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getName());
1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (XmlPullParserException e) {
1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (java.io.IOException e) {
1580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mPendingPackages.size();
1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final PendingPackage pp = mPendingPackages.get(i);
1589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Object idObj = getUserIdLPr(pp.sharedId);
1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (idObj != null && idObj instanceof SharedUserSetting) {
1591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p == null) {
1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unable to create application package for " + pp.name);
1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(pp);
1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (idObj != null) {
1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not a shared uid\n";
1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not defined\n";
1608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPendingPackages.clear();
1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
16141d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        /*
16151d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * Make sure all the updated system packages have their shared users
16161d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * associated with them.
16171d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         */
16181d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
16191d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        while (disabledIt.hasNext()) {
16201d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final PackageSetting disabledPs = disabledIt.next();
1621135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            final Object id = getUserIdLPr(disabledPs.appId);
16221d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            if (id != null && id instanceof SharedUserSetting) {
16231d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root                disabledPs.sharedUser = (SharedUserSetting) id;
16241d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            }
16251d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        }
16261d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root
1627483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (mBackupStoppedPackagesFilename.exists()
1628483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                || mStoppedPackagesFilename.exists()) {
1629483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // Read old file
1630483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            readStoppedLPw();
1631483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mBackupStoppedPackagesFilename.delete();
1632483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mStoppedPackagesFilename.delete();
1633483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // Migrate to new file format
1634483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            writePackageRestrictionsLPr(0);
1635483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } else {
1636483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (users == null) {
1637483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                readPackageRestrictionsLPr(0);
1638483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            } else {
1639483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                for (UserInfo user : users) {
1640483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    readPackageRestrictionsLPr(user.id);
1641483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
1642483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
1643483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
1644cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1645cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                + mSharedUsers.size() + " shared uids\n");
1646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
1648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1650fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn    private void readDefaultPreferredAppsLPw() {
1651fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        // Read preferred apps from .../etc/preferred-apps directory.
1652fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
1653fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        if (!preferredDir.exists() || !preferredDir.isDirectory()) {
1654fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            return;
1655fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1656fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        if (!preferredDir.canRead()) {
1657fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
1658fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            return;
1659fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1660fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1661fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        // Iterate over the files in the directory and scan .xml files
1662fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        for (File f : preferredDir.listFiles()) {
1663fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            if (!f.getPath().endsWith(".xml")) {
1664fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
1665fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                continue;
1666fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1667fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            if (!f.canRead()) {
1668fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
1669fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                continue;
1670fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1671fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1672fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            FileInputStream str = null;
1673fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            try {
1674fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                str = new FileInputStream(f);
1675fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                XmlPullParser parser = Xml.newPullParser();
1676fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                parser.setInput(str, null);
1677fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1678fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                int type;
1679fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                while ((type = parser.next()) != XmlPullParser.START_TAG
1680fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                        && type != XmlPullParser.END_DOCUMENT) {
1681fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    ;
1682fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1683fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1684fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (type != XmlPullParser.START_TAG) {
1685fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
1686fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    continue;
1687fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1688fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (!"preferred-activities".equals(parser.getName())) {
1689fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    Slog.w(TAG, "Preferred apps file " + f
1690fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                            + " does not start with 'preferred-activities'");
1691fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    continue;
1692fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1693fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                readPreferredActivitiesLPw(parser);
1694fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } catch (XmlPullParserException e) {
1695fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Error reading apps file " + f, e);
1696fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } catch (IOException e) {
1697fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Error reading apps file " + f, e);
1698fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } finally {
1699fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (str != null) {
1700fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    try {
1701fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                        str.close();
1702fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    } catch (IOException e) {
1703fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    }
1704fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1705fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1706fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1707fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn    }
1708fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String v = parser.getAttributeValue(ns, name);
1711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (v == null) {
1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return defValue;
1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return Integer.parseInt(v);
1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: attribute " + name
1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " has bad integer value " + v + " at "
1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return defValue;
1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1725447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1735447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String tagName = parser.getName();
1736483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
1737483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                final String name = parser.getAttributeValue(null, ATTR_NAME);
1738447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String sourcePackage = parser.getAttributeValue(null, "package");
1739447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String ptype = parser.getAttributeValue(null, "type");
1740cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null && sourcePackage != null) {
1741447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final boolean dynamic = "dynamic".equals(ptype);
1742447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final BasePermission bp = new BasePermission(name, sourcePackage,
1743cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1744cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.protectionLevel = readInt(parser, null, "protection",
1745cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            PermissionInfo.PROTECTION_NORMAL);
1746e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel);
1747cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dynamic) {
1748cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        PermissionInfo pi = new PermissionInfo();
1749cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.packageName = sourcePackage.intern();
1750cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.name = name.intern();
1751cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.icon = readInt(parser, null, "icon", 0);
1752cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1753cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.protectionLevel = bp.protectionLevel;
1754cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo = pi;
1755cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1756cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    out.put(bp.name, bp);
1757cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1758cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1759cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: permissions has" + " no name at "
1760cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1761cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1762cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1763cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element reading permissions: " + parser.getName() + " at "
1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1770cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1771447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
1772cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        String name = parser.getAttributeValue(null, ATTR_NAME);
1774cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = parser.getAttributeValue(null, "realName");
1775cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = parser.getAttributeValue(null, "codePath");
1776cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1777cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1778cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (resourcePathStr == null) {
1779cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = codePathStr;
1780cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1781cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = parser.getAttributeValue(null, "version");
1782cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1783cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (version != null) {
1784cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1785cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                versionCode = Integer.parseInt(version);
1786cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1787cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1788cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1789cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1790cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1791cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1792cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1793cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1794cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String timeStampStr = parser.getAttributeValue(null, "ft");
1795cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1796cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1797cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                long timeStamp = Long.parseLong(timeStampStr, 16);
1798cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.setTimeStamp(timeStamp);
1799cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1800cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1801cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1802cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ts");
1803cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1804cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1805cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    long timeStamp = Long.parseLong(timeStampStr);
1806cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ps.setTimeStamp(timeStamp);
1807cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1808cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1809cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1810cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1811cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "it");
1812cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1813cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1814cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1815cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1816cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1817cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1818cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "ut");
1819cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1820cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1821cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1822cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1823cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1824cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1825cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = parser.getAttributeValue(null, "userId");
1826135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
1827135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        if (ps.appId <= 0) {
1828cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1829135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("perms")) {
1841447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                readGrantedPermissionsLPw(parser, ps.grantedPermissions);
1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <updated-package>: " + parser.getName());
1845cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.put(name, ps);
1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1851447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = null;
1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1855cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String sharedIdStr = null;
1856cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = null;
1857cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = null;
1858cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = null;
1859cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String systemStr = null;
1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String installerPackageName = null;
1861cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String uidError = null;
1862cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long timeStamp = 0;
1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long firstInstallTime = 0;
1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long lastUpdateTime = 0;
1866cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSettingBase packageSetting = null;
1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = null;
1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            name = parser.getAttributeValue(null, ATTR_NAME);
1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            realName = parser.getAttributeValue(null, "realName");
1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            uidError = parser.getAttributeValue(null, "uidError");
1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            codePathStr = parser.getAttributeValue(null, "codePath");
1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            version = parser.getAttributeValue(null, "version");
1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (version != null) {
1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    versionCode = Integer.parseInt(version);
1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            installerPackageName = parser.getAttributeValue(null, "installer");
1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            systemStr = parser.getAttributeValue(null, "flags");
1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (systemStr != null) {
1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags = Integer.parseInt(systemStr);
1891cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1893cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // For backward compatibility
1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                systemStr = parser.getAttributeValue(null, "system");
1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (systemStr != null) {
1897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            : 0;
1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Old settings that don't specify system... just treat
1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // them as system, good enough.
1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String timeStampStr = parser.getAttributeValue(null, "ft");
1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    timeStamp = Long.parseLong(timeStampStr, 16);
1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                timeStampStr = parser.getAttributeValue(null, "ts");
1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (timeStampStr != null) {
1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        timeStamp = Long.parseLong(timeStampStr);
1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "it");
1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    firstInstallTime = Long.parseLong(timeStampStr, 16);
1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ut");
1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    lastUpdateTime = Long.parseLong(timeStampStr, 16);
1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " sharedUserId=" + sharedIdStr);
1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (resourcePathStr == null) {
1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePathStr = codePathStr;
1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (realName != null) {
1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                realName = realName.intern();
1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1946cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no name at "
1947cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (codePathStr == null) {
1949cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no codePath at "
1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId > 0) {
1953447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkgFlags);
1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_SETTINGS)
1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " pkg=" + packageSetting);
1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (packageSetting == null) {
1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
1961cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " while parsing settings at "
1962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (sharedIdStr != null) {
1969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (userId > 0) {
1971cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting = new PendingPackage(name.intern(), realName, new File(
1972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
1973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            versionCode, pkgFlags);
1974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
1975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
1976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
1977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPendingPackages.add((PendingPackage) packageSetting);
1978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_SETTINGS)
1979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Log.i(PackageManagerService.TAG, "Reading package " + name
1980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + ": sharedUserId=" + userId + " pkg=" + packageSetting);
1981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: package " + name
1984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " has bad sharedId " + sharedIdStr + " at "
1985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: package " + name + " has bad userId "
1990cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + idStr + " at " + parser.getPositionDescription());
1991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
1995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
1996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSetting != null) {
1998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.uidError = "true".equals(uidError);
1999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.installerPackageName = installerPackageName;
2000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
2001483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // Handle legacy string here for single-user mode
2002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
2003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (enabledStr != null) {
2004b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                try {
2005483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */);
2006b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                } catch (NumberFormatException e) {
2007b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    if (enabledStr.equalsIgnoreCase("true")) {
2008483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0);
2009b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("false")) {
2010483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0);
2011b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("default")) {
2012483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
2013b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else {
2014b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        PackageManagerService.reportSettingsProblem(Log.WARN,
2015b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                "Error in package manager settings: package " + name
2016b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + " has bad enabled value: " + idStr + " at "
2017b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + parser.getPositionDescription());
2018b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    }
2019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2021483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
2022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2023483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String installStatusStr = parser.getAttributeValue(null, "installStatus");
2025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (installStatusStr != null) {
2026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (installStatusStr.equalsIgnoreCase("false")) {
2027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
2028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
2030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
2034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
2035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
2039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
2042483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                // Legacy
2043483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
2044483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    readDisabledComponentsLPw(packageSetting, parser, 0);
2045483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
2046483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    readEnabledComponentsLPw(packageSetting, parser, 0);
2047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("sigs")) {
2048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.signatures.readXml(parser, mPastSignatures);
2049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
2050447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
2051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.permissionsFixed = true;
2052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <package>: " + parser.getName());
2055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
2056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
2059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2063483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2064483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int userId) throws IOException, XmlPullParserException {
2065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2074483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2075483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2077483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.addDisabledComponent(name.intern(), userId);
2078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <disabled-components> has"
2081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
2082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <disabled-components>: " + parser.getName());
2086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2091483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2092483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int userId) throws IOException, XmlPullParserException {
2093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2102483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2105483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.addEnabledComponent(name.intern(), userId);
2106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <enabled-components> has"
2109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
2110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <enabled-components>: " + parser.getName());
2114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2119483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
2120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
2121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
2122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
2123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting su = null;
2124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
2125483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            name = parser.getAttributeValue(null, ATTR_NAME);
2126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
2127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
2128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if ("true".equals(parser.getAttributeValue(null, "system"))) {
2129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
2130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
2132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <shared-user> has no name at "
2134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId == 0) {
2136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: shared-user " + name
2138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + " has bad userId " + idStr + " at "
2139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2141447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
2142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService
2143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
2144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
2148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
2149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
2150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
2151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ;
2153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (su != null) {
2155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
2156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
2157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
2161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
2164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("sigs")) {
2165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    su.signatures.readXml(parser, mPastSignatures);
2166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
2167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, su.grantedPermissions);
2168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <shared-user>: " + parser.getName());
2171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
2172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
2176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2180447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
2181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
2182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2191483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2192483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    outPerms.add(name.intern());
2195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2197cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <perms> has" + " no name at "
2198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <perms>: " + parser.getName());
2203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2208447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException,
2209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
2210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2219483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PreferredActivity pa = new PreferredActivity(parser);
2221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pa.mPref.getParseError() == null) {
2222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPreferredActivities.addFilter(pa);
2223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <preferred-activity> "
2226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + pa.mPref.getParseError() + " at "
2227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <preferred-activities>: " + parser.getName());
2232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
2233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2237135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    void removeUserLPr(int userId) {
2238135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        File file = getUserPackagesStateFile(userId);
2239135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file.delete();
2240135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file = getUserPackagesStateBackupFile(userId);
2241135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file.delete();
2242135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
2243135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
2244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Returns -1 if we could not find an available UserId to assign
2245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private int newUserIdLPw(Object obj) {
2246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Let's be stupidly inefficient for now...
2247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mUserIds.size();
2248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
2249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(i) == null) {
2250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.set(i, obj);
225121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn                return Process.FIRST_APPLICATION_UID + i;
2252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // None left?
225621fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
2257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return -1;
2258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mUserIds.add(obj);
226121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        return Process.FIRST_APPLICATION_UID + N;
2262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
22640aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
22650aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        if (mVerifierDeviceIdentity == null) {
22660aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
22670aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
22680aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            writeLPr();
22690aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        }
22700aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
22710aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        return mVerifierDeviceIdentity;
22720aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    }
22730aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
2274447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public PackageSetting getDisabledSystemPkgLPr(String name) {
2275447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ps = mDisabledSysPackages.get(name);
2276447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return ps;
2277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2279483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) {
2280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
2282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2283483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        final String pkgName = componentInfo.packageName;
2284483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        final PackageSetting packageSettings = mPackages.get(pkgName);
2285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (PackageManagerService.DEBUG_SETTINGS) {
2286483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = "
2287483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    + componentInfo.packageName + " componentName = " + componentInfo.name);
2288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "enabledComponents: "
2289483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    + Arrays.toString(packageSettings.getEnabledComponents(userId).toArray()));
2290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "disabledComponents: "
2291483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    + Arrays.toString(packageSettings.getDisabledComponents(userId).toArray()));
2292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings == null) {
2294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2296483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        final int enabled = packageSettings.getEnabled(userId);
2297483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (enabled == COMPONENT_ENABLED_STATE_DISABLED
2298483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                || enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
2299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
2300483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    && enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
2301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2303483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (packageSettings.getEnabledComponents(userId).contains(componentInfo.name)) {
2304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
2305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2306483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (packageSettings.getDisabledComponents(userId).contains(componentInfo.name)) {
2307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return componentInfo.enabled;
2310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2311447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2312447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    String getInstallerPackageNameLPr(String packageName) {
2313447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2315447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2316447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2317447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.installerPackageName;
2318447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2319447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2320483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getApplicationEnabledSettingLPr(String packageName, int userId) {
2321447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2322447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2323447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2324447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2325483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return pkg.getEnabled(userId);
2326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2327447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2328483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
2329447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String packageName = componentName.getPackageName();
2330447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2331447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2332447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown component: " + componentName);
2333447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2334447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String classNameStr = componentName.getClassName();
2335483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
2336447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2337483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2338447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
2339483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            boolean allowedByPermission, int uid, int userId) {
2340483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int appId = UserId.getAppId(uid);
2341447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkgSetting = mPackages.get(packageName);
2342447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting == null) {
2343447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2344447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2345135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        if (!allowedByPermission && (appId != pkgSetting.appId)) {
2346447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new SecurityException(
2347447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Permission Denial: attempt to change stopped state from pid="
2348447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + Binder.getCallingPid()
2349135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
2350447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2351447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (DEBUG_STOPPED) {
2352447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (stopped) {
2353447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                RuntimeException e = new RuntimeException("here");
2354447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                e.fillInStackTrace();
2355447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                Slog.i(TAG, "Stopping package " + packageName, e);
2356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2357447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2358483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (pkgSetting.getStopped(userId) != stopped) {
2359483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            pkgSetting.setStopped(stopped, userId);
2360483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // pkgSetting.pkg.mSetStopped = stopped;
2361483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (pkgSetting.getNotLaunched(userId)) {
2362447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (pkgSetting.installerPackageName != null) {
2363447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
2364447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.name, null,
2365135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                            pkgSetting.installerPackageName, null, userId);
2366447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2367483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pkgSetting.setNotLaunched(false, userId);
2368447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2369447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            return true;
2370447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2371447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return false;
2372447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2373447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2374483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private List<UserInfo> getAllUsers() {
23757ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        long id = Binder.clearCallingIdentity();
2376483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        try {
2377483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            return AppGlobals.getPackageManager().getUsers();
2378483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (RemoteException re) {
2379483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // Local to system process, shouldn't happen
2380483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (NullPointerException npe) {
2381483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // packagemanager not yet initialized
23827ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        } finally {
23837ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani            Binder.restoreCallingIdentity(id);
2384483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
2385483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return null;
2386483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
2387483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
238820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    static final void printFlags(PrintWriter pw, int val, Object[] spec) {
238920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        pw.print("[ ");
239020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        for (int i=0; i<spec.length; i+=2) {
239120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            int mask = (Integer)spec[i];
239220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            if ((val & mask) != 0) {
239320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print(spec[i+1]);
239420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print(" ");
239520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            }
239620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        }
239720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        pw.print("]");
239820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    }
239920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato
240020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    static final Object[] FLAG_DUMP_SPEC = new Object[] {
240120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
240220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
240320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
240420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
240520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
240620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
240720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
240820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
240920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
241020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
241120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
241220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
241320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
241420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
241520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
241620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_STOPPED, "STOPPED",
241720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK",
241820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
241920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    };
242020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato
2421447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2422447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2423447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Date date = new Date();
2424447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
24257ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        List<UserInfo> users = getAllUsers();
2426447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (final PackageSetting ps : mPackages.values()) {
2427447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(ps.realName)
2428447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    && !packageName.equals(ps.name)) {
2429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2432447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null) {
2433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                dumpState.setSharedUser(ps.sharedUser);
2434447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2435447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2436447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2437447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2439447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Packages:");
2440447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2442447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Package [");
2443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2445447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2448447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.realName != null) {
2449447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    compat name=");
2450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.name);
2451447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2452447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2453135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            pw.print("    userId="); pw.print(ps.appId);
2454447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2455447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sharedUser="); pw.println(ps.sharedUser);
2456447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkg="); pw.println(ps.pkg);
2457447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    codePath="); pw.println(ps.codePathString);
2458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    resourcePath="); pw.println(ps.resourcePathString);
2459447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2460447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    versionCode="); pw.println(ps.versionCode);
2461447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.pkg != null) {
2462eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                pw.print("    applicationInfo="); pw.println(ps.pkg.applicationInfo.toString());
246320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print("    flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println();
2464447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    versionName="); pw.println(ps.pkg.mVersionName);
2465447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2466447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2467447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.pkg.mOperationPending) {
2468447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("    mOperationPending=true");
2469447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2470447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    supportsScreens=[");
2471447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                boolean first = true;
2472447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2473447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2474447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2475447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2476447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("small");
2477447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2478447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2479447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2480447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2481447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2482447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("medium");
2483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2484447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2485447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2486447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2487447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("large");
2489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2491447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2492447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2493447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2494447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("xlarge");
2495447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2496447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2497447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2498447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2499447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2500447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("resizeable");
2501447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2502447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2503447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2504447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2505447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2506447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("anyDensity");
2507447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2508447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2509447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("]");
2510447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    timeStamp=");
2511447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.timeStamp);
2512447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2513447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    firstInstallTime=");
2514447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.firstInstallTime);
2515447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2516447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    lastUpdateTime=");
2517447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.lastUpdateTime);
2518447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2519447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.installerPackageName != null) {
2520447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    installerPackageName="); pw.println(ps.installerPackageName);
2521447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2522447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    signatures="); pw.println(ps.signatures);
2523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    permissionsFixed="); pw.print(ps.permissionsFixed);
2524447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" haveGids="); pw.println(ps.haveGids);
2525447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags));
2526447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" installStatus="); pw.print(ps.installStatus);
2527483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            for (UserInfo user : users) {
2528483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(" User "); pw.print(user.id); pw.print(": ");
2529483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(" stopped=");
2530483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(ps.getStopped(user.id));
2531483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(" enabled=");
2532483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.println(ps.getEnabled(user.id));
2533483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (ps.getDisabledComponents(user.id).size() > 0) {
2534483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    pw.println("    disabledComponents:");
2535483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    for (String s : ps.getDisabledComponents(user.id)) {
2536483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pw.print("      "); pw.println(s);
2537483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
2538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2539483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (ps.getEnabledComponents(user.id).size() > 0) {
2540483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    pw.println("    enabledComponents:");
2541483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    for (String s : ps.getEnabledComponents(user.id)) {
2542483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pw.print("      "); pw.println(s);
2543483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
2544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2546447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.grantedPermissions.size() > 0) {
2547447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    grantedPermissions:");
2548447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.grantedPermissions) {
2549447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2550447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2551447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2552447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2553447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2554447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2555447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mRenamedPackages.size() > 0) {
25562f36229db823d152f3efd879e751e81a601a75b0Andy McFadden            for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
2557447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(e.getKey())
2558447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(e.getValue())) {
2559447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2560447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2563447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2564447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Renamed packages:");
2565447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2567447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  ");
2568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(e.getKey());
2569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(" -> ");
2570447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(e.getValue());
2571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mDisabledSysPackages.size() > 0) {
2576447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting ps : mDisabledSysPackages.values()) {
2577447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(ps.realName)
2578447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(ps.name)) {
2579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2582447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2583447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Hidden system packages:");
2585447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  Package [");
2588447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2590447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2592447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.realName != null) {
2593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("    compat name=");
2594447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(ps.name);
2595447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2596eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                if (ps.pkg != null && ps.pkg.applicationInfo != null) {
2597eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                    pw.print("    applicationInfo=");
2598eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                    pw.println(ps.pkg.applicationInfo.toString());
2599eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                }
2600447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    userId=");
2601135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                pw.println(ps.appId);
2602447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    sharedUser=");
2603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.sharedUser);
2604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    codePath=");
2605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.codePathString);
2606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    resourcePath=");
2607447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.resourcePathString);
2608447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2609447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2610447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2611483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2612447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (BasePermission p : mPermissions.values()) {
2615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(p.sourcePackage)) {
2616447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2618447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2619447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2620447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Permissions:");
2622447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Permission ["); pw.print(p.name); pw.print("] (");
2625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(Integer.toHexString(System.identityHashCode(p)));
2626447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sourcePackage="); pw.println(p.sourcePackage);
2628447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    uid="); pw.print(p.uid);
2629447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" type="); pw.print(p.type);
2631e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    pw.print(" prot=");
2632e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    pw.println(PermissionInfo.protectionToString(p.protectionLevel));
2633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.packageSetting != null) {
2634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    packageSetting="); pw.println(p.packageSetting);
2635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2636447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.perm != null) {
2637447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    perm="); pw.println(p.perm);
2638447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
26391c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey            if (READ_EXTERNAL_STORAGE.equals(p.name)) {
26405d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                pw.print("    enforced=");
26415d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                pw.println(mReadExternalStorageEnforced);
26421c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey            }
2643447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
26451c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey
2646447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2647447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2648447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (SharedUserSetting su : mSharedUsers.values()) {
2649447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && su != dumpState.getSharedUser()) {
2650447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2651447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2652447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2653447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2654447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2655447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Shared users:");
2656447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2657447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2658447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  SharedUser [");
2659447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.name);
2660447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("] (");
2661447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(Integer.toHexString(System.identityHashCode(su)));
2662447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2663447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId=");
2664447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.userId);
2665447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids=");
2666447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println(PackageManagerService.arrayToString(su.gids));
2667447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("    grantedPermissions:");
2668447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (String s : su.grantedPermissions) {
2669447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("      ");
2670447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(s);
2671447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2672447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2673447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2674447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.println("Settings parse messages:");
2677447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.print(mReadMessages.toString());
2678447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
26792f36229db823d152f3efd879e751e81a601a75b0Andy McFadden}
2680