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
35447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.ComponentName;
36258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.content.Context;
37447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.content.Intent;
38cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ApplicationInfo;
39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.ComponentInfo;
407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.PackageCleanItem;
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageManager;
42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser;
43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PermissionInfo;
44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.Signature;
45483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport android.content.pm.UserInfo;
467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackbornimport android.content.pm.PackageUserState;
470aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.content.pm.VerifierDeviceIdentity;
48447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport android.os.Binder;
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Environment;
50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.FileUtils;
51cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.os.Process;
52f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
53cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Log;
54cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Slog;
55cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.SparseArray;
56cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.util.Xml;
57cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
58cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.BufferedOutputStream;
59cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
60cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileInputStream;
61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.FileOutputStream;
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.IOException;
63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.PrintWriter;
64447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.text.SimpleDateFormat;
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.ArrayList;
66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Arrays;
67447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Rootimport java.util.Date;
68cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashMap;
69cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
70cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.Iterator;
71483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasaniimport java.util.List;
722f36229db823d152f3efd879e751e81a601a75b0Andy McFaddenimport java.util.Map;
736309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackbornimport java.util.Set;
746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackbornimport java.util.Map.Entry;
75cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
7662539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Rootimport libcore.io.IoUtils;
7762539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root
78cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
79cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Holds information about dynamic settings.
80cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class Settings {
82447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final String TAG = "PackageSettings";
83447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
84447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private static final boolean DEBUG_STOPPED = false;
85258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private static final boolean DEBUG_MU = false;
86447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
87edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey    private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
88edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey    private static final String ATTR_ENFORCEMENT = "enforcement";
89edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
90483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_ITEM = "item";
91483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_DISABLED_COMPONENTS = "disabled-components";
92483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_ENABLED_COMPONENTS = "enabled-components";
93483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions";
94483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String TAG_PACKAGE = "pkg";
95483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
96483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_NAME = "name";
977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private static final String ATTR_USER = "user";
987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private static final String ATTR_CODE = "code";
99483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_NOT_LAUNCHED = "nl";
100483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_ENABLED = "enabled";
101483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private static final String ATTR_STOPPED = "stopped";
1027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private static final String ATTR_INSTALLED = "inst";
103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mSettingsFilename;
105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupSettingsFilename;
106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mPackageListFilename;
107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mStoppedPackagesFilename;
108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final File mBackupStoppedPackagesFilename;
109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, PackageSetting> mPackages =
110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, PackageSetting>();
111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // List of replaced system applications
112c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    private final HashMap<String, PackageSetting> mDisabledSysPackages =
113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        new HashMap<String, PackageSetting>();
114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // These are the last platform API version we were using for
116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // the apps installed on internal and external storage.  It is
117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // used to grant newer permissions one time during a system upgrade.
118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mInternalSdkPlatform;
119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int mExternalSdkPlatform;
1200aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
121f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey    Boolean mReadExternalStorageEnforced;
122edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
1230aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    /** Device identity for the purpose of package verification. */
1240aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    private VerifierDeviceIdentity mVerifierDeviceIdentity;
1250aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // The user's preferred activities associated with particular intent
127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // filters.
1286309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    final SparseArray<PreferredIntentResolver> mPreferredActivities =
1296309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            new SparseArray<PreferredIntentResolver>();
1306309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, SharedUserSetting> mSharedUsers =
132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, SharedUserSetting>();
133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Object> mUserIds = new ArrayList<Object>();
134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final SparseArray<Object> mOtherUserIds =
135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new SparseArray<Object>();
136cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
137cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // For reading/writing settings file.
138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private final ArrayList<Signature> mPastSignatures =
139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new ArrayList<Signature>();
140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission names to info about them.
142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissions =
143cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Mapping from permission tree names to info about them.
146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, BasePermission> mPermissionTrees =
147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            new HashMap<String, BasePermission>();
148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been uninstalled and still need their external
150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // storage data deleted.
151752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey    final ArrayList<PackageCleanItem> mPackagesToBeCleaned = new ArrayList<PackageCleanItem>();
152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Packages that have been renamed since they were first installed.
154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Keys are the new names of the packages, values are the original
155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.  The packages appear everwhere else under their original
156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // names.
157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashMap<String, String> mRenamedPackages = new HashMap<String, String>();
158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final StringBuilder mReadMessages = new StringBuilder();
160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
161447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    /**
162447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * Used to track packages that have a shared user ID that hasn't been read
163447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * in yet.
164447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * <p>
165447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * TODO: make this just a local variable that is passed in during package
166447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     * scanning to make it less confusing.
167447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root     */
168447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
170258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    private final Context mContext;
171258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani
172483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private final File mSystemDir;
173258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    Settings(Context context) {
174258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        this(context, Environment.getDataDirectory());
175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
177258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    Settings(Context context, File dataDir) {
178258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mContext = context;
179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSystemDir = new File(dataDir, "system");
180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSystemDir.mkdirs();
181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        FileUtils.setPermissions(mSystemDir.toString(),
182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.S_IRWXU|FileUtils.S_IRWXG
183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                |FileUtils.S_IROTH|FileUtils.S_IXOTH,
184cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                -1, -1);
185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mSettingsFilename = new File(mSystemDir, "packages.xml");
186483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
187483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mPackageListFilename = new File(mSystemDir, "packages.list");
188483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // Deprecated: Needed for migration
189483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
190483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
193447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting getPackageLPw(PackageParser.Package pkg, PackageSetting origPackage,
194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
1957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            String nativeLibraryPathString, int pkgFlags, UserHandle user, boolean add) {
196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String name = pkg.packageName;
197447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting p = getPackageLPw(name, origPackage, realName, sharedUser, codePath,
1987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                resourcePath, nativeLibraryPathString, pkg.mVersionCode, pkgFlags,
199f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                user, add, true /* allowInstall */);
200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
203447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting peekPackageLPr(String name) {
204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return mPackages.get(name);
205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallStatus(String pkgName, int status) {
208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if(p.getInstallStatus() != status) {
211cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setInstallStatus(status);
212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    void setInstallerPackageName(String pkgName,
217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String installerPkgName) {
218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(pkgName);
219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p != null) {
220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.setInstallerPackageName(installerPkgName);
221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
224447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting getSharedUserLPw(String name,
225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int pkgFlags, boolean create) {
226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s == null) {
228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!create) {
229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            s = new SharedUserSetting(name, pkgFlags);
23221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            s.userId = newUserIdLPw(s);
233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.i(PackageManagerService.TAG, "New shared user " + name + ": id=" + s.userId);
234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // < 0 means we couldn't assign a userid; fall out and return
235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // s, which is currently null
236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId >= 0) {
237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSharedUsers.put(name, s);
238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return s;
242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
244447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean disableSystemPackageLPw(String name) {
245447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not an installed package");
248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
250447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting dp = mDisabledSysPackages.get(name);
251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // always make sure the system package code and resource paths dont change
252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (dp == null) {
253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mDisabledSysPackages.put(name, p);
257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // a little trick...  when we install the new package, we don't
259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // want to modify the existing PackageSetting for the built-in
260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // version.  so at this point we need a new PackageSetting that
261cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // is okay to muck with.
262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageSetting newp = new PackageSetting(p);
263447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            replacePackageLPw(name, newp);
264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return false;
267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
269447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting enableSystemPackageLPw(String name) {
270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mDisabledSysPackages.get(name);
271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if(p == null) {
272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.w(PackageManagerService.TAG, "Package:"+name+" is not disabled");
273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Reset flag in ApplicationInfo object
276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if((p.pkg != null) && (p.pkg.applicationInfo != null)) {
277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
279447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ret = addPackageLPw(name, p.realName, p.codePath, p.resourcePath,
280135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                p.nativeLibraryPathString, p.appId, p.versionCode, p.pkgFlags);
281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.remove(name);
282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
285c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    boolean isDisabledSystemPackageLPr(String name) {
286c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root        return mDisabledSysPackages.containsKey(name);
287c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    }
288c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root
289c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    void removeDisabledSystemPackageLPw(String name) {
290c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root        mDisabledSysPackages.remove(name);
291c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root    }
292c52d6fd04316483f4a88f3a087b93bb197cd97f4Kenny Root
293447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    PackageSetting addPackageLPw(String name, String realName, File codePath, File resourcePath,
294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String nativeLibraryPathString, int uid, int vc, int pkgFlags) {
295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
297135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (p.appId == uid) {
298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return p;
299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate package, keeping first: " + name);
302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                vc, pkgFlags);
306135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        p.appId = uid;
307447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, p, name)) {
308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.put(name, p);
309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return p;
310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
314447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    SharedUserSetting addSharedUserLPw(String name, int uid, int pkgFlags) {
315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting s = mSharedUsers.get(name);
316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (s != null) {
317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (s.userId == uid) {
318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return s;
319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR,
321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Adding duplicate shared user, keeping first: " + name);
322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return null;
323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s = new SharedUserSetting(name, pkgFlags);
325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        s.userId = uid;
326447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (addUserIdLPw(uid, s, name)) {
327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mSharedUsers.put(name, s);
328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return s;
329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return null;
331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Transfer ownership of permissions from one package to another.
334447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void transferPermissionsLPw(String origPkg, String newPkg) {
335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Transfer ownership of permissions to the new package.
336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i=0; i<2; i++) {
337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            HashMap<String, BasePermission> permissions =
338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    i == 0 ? mPermissionTrees : mPermissions;
339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : permissions.values()) {
340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (origPkg.equals(bp.sourcePackage)) {
341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG,
342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Moving permission " + bp.name
343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " from pkg " + bp.sourcePackage
344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " to " + newPkg);
345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.sourcePackage = newPkg;
346cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.packageSetting = null;
347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.perm = null;
348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (bp.pendingInfo != null) {
349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo.packageName = newPkg;
350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.uid = 0;
352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.gids = null;
353cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
357483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
358447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private PackageSetting getPackageLPw(String name, PackageSetting origPackage,
359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,
3607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            String nativeLibraryPathString, int vc, int pkgFlags,
361f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            UserHandle installUser, boolean add, boolean allowInstall) {
362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting p = mPackages.get(name);
363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!p.codePath.equals(codePath)) {
365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Check to see if its a disabled system app
366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((p.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // This is an updated system app with versions in both system
368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // and data partition. Just let the most recent version
369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // take precedence.
370483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Trying to update system app code path from "
371483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + p.codePathString + " to " + codePath.toString());
372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Just a change in the code path is not an issue, but
374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // let's log a message about it.
375483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.i(PackageManagerService.TAG, "Package " + name + " codePath changed from "
376483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + p.codePath + " to " + codePath + "; Retaining data and using new");
377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    /*
378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * Since we've changed paths, we need to prefer the new
379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * native library path over the one stored in the
380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * package settings since we might have moved from
381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     * internal to external storage or vice versa.
382cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                     */
383cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.nativeLibraryPathString = nativeLibraryPathString;
384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != sharedUser) {
387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " shared user changed from "
389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (p.sharedUser != null ? p.sharedUser.name : "<nothing>")
390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " to "
391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + (sharedUser != null ? sharedUser.name : "<nothing>")
392cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; replacing with new");
393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = null;
394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0) {
396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If what we are scanning is a system package, then
397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // make it so, regardless of whether it was previously
398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // installed only in the data partition.
399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    p.pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p == null) {
404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (origPackage != null) {
405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We are consuming the data from an existing package.
406cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(origPackage.name, name, codePath, resourcePath,
407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
408483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, "Package "
409483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + name + " is adopting original package " + origPackage.name);
410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Note that we will retain the new package's signature so
411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // that we can keep its data.
412cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageSignatures s = p.signatures;
413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(origPackage);
414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.signatures = s;
415cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = origPackage.sharedUser;
416135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                p.appId = origPackage.appId;
417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.origPackage = origPackage;
418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mRenamedPackages.put(name, origPackage.name);
419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                name = origPackage.name;
420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Update new package state.
421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p = new PackageSetting(name, realName, codePath, resourcePath,
424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        nativeLibraryPathString, vc, pkgFlags);
425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.setTimeStamp(codePath.lastModified());
426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser = sharedUser;
427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is not a system app, it starts out stopped.
428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if ((pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) {
429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (DEBUG_STOPPED) {
430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        RuntimeException e = new RuntimeException("here");
431cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        e.fillInStackTrace();
432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Slog.i(PackageManagerService.TAG, "Stopping package " + name, e);
433cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
434483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    List<UserInfo> users = getAllUsers();
435f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                    if (users != null && allowInstall) {
436483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        for (UserInfo user : users) {
4377767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // By default we consider this app to be installed
4387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // for the user if no user has been specified (which
4397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // means to leave it at its original value, and the
4407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // original default value is true), or we are being
4417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // asked to install for all users, or this is the
4427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            // user we are installing for.
4437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            final boolean installed = installUser == null
4447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    || installUser.getIdentifier() == UserHandle.USER_ALL
4457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    || installUser.getIdentifier() == user.id;
4467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            p.setUserState(user.id, COMPONENT_ENABLED_STATE_DEFAULT,
4477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    installed,
4487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    true, // stopped,
4497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    true, // notLaunched
4507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                    null, null);
451483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            writePackageRestrictionsLPr(user.id);
452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
453483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (sharedUser != null) {
456135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    p.appId = sharedUser.userId;
45721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn                } else {
458cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Clone the setting here for disabled system packages
459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting dis = mDisabledSysPackages.get(name);
460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dis != null) {
461cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // For disabled packages a new setting is created
462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // from the existing user id. This still has to be
463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // added to list of user id's
464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Copy signatures from previous setting
465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (dis.signatures.mSignatures != null) {
466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            p.signatures.mSignatures = dis.signatures.mSignatures.clone();
467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
468135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        p.appId = dis.appId;
469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone permissions
470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        p.grantedPermissions = new HashSet<String>(dis.grantedPermissions);
471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Clone component info
472483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        List<UserInfo> users = getAllUsers();
473483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (users != null) {
474483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            for (UserInfo user : users) {
475483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                int userId = user.id;
4767767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                p.setDisabledComponentsCopy(
4777767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                        dis.getDisabledComponents(userId), userId);
4787767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                p.setEnabledComponentsCopy(
4797767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                        dis.getEnabledComponents(userId), userId);
480483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            }
481483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Add new setting to list of user ids
483135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        addUserIdLPw(p.appId, p, name);
484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        // Assign new user id
486135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                        p.appId = newUserIdLPw(p);
487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
490135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            if (p.appId < 0) {
491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + name + " could not be assigned a valid uid");
493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return null;
494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (add) {
496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // Finish adding new package by adding it and updating shared
497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // user preferences
498447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                addPackageSettingLPw(p, name, sharedUser);
499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
5007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        } else {
501f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            if (installUser != null && allowInstall) {
5027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                // The caller has explicitly specified the user they want this
5037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                // package installed for, and the package already exists.
5047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                // Make sure it conforms to the new request.
5057767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                List<UserInfo> users = getAllUsers();
5067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                if (users != null) {
5077767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    for (UserInfo user : users) {
5087767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        if (installUser.getIdentifier() == UserHandle.USER_ALL
5097767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                || installUser.getIdentifier() == user.id) {
5107767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            boolean installed = p.getInstalled(user.id);
5117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            if (!installed) {
5127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                p.setInstalled(true, user.id);
5137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                writePackageRestrictionsLPr(user.id);
5147767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            }
5157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        }
5167767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    }
5177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                }
5187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            }
519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return p;
521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
523447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void insertPackageSettingLPw(PackageSetting p, PackageParser.Package pkg) {
524cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        p.pkg = pkg;
525483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // pkg.mSetEnabled = p.getEnabled(userId);
526483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // pkg.mSetStopped = p.getStopped(userId);
527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String codePath = pkg.applicationInfo.sourceDir;
528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String resourcePath = pkg.applicationInfo.publicSourceDir;
529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update code path if needed
530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!codePath.equalsIgnoreCase(p.codePathString)) {
531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Code path for pkg : " + p.pkg.packageName +
532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.codePathString + " to " + codePath);
533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePath = new File(codePath);
534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.codePathString = codePath;
535cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Update resource path if needed
537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!resourcePath.equalsIgnoreCase(p.resourcePathString)) {
538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Slog.w(PackageManagerService.TAG, "Resource path for pkg : " + p.pkg.packageName +
539cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    " changing from " + p.resourcePathString + " to " + resourcePath);
540cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePath = new File(resourcePath);
541cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.resourcePathString = resourcePath;
542cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update the native library path if needed
544cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final String nativeLibraryPath = pkg.applicationInfo.nativeLibraryDir;
545cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (nativeLibraryPath != null
546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && !nativeLibraryPath.equalsIgnoreCase(p.nativeLibraryPathString)) {
547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.nativeLibraryPathString = nativeLibraryPath;
548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update version code if needed
550483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (pkg.mVersionCode != p.versionCode) {
551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.versionCode = pkg.mVersionCode;
552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
553483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // Update signatures if needed.
554483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (p.signatures.mSignatures == null) {
555483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            p.signatures.assignSignatures(pkg.mSignatures);
556483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
5575455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root        // Update flags if needed.
5585455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root        if (pkg.applicationInfo.flags != p.pkgFlags) {
5595455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root            p.pkgFlags = pkg.applicationInfo.flags;
5605455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root        }
561483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // If this app defines a shared user id initialize
562483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        // the shared user signatures as well.
563483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (p.sharedUser != null && p.sharedUser.signatures.mSignatures == null) {
564483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            p.sharedUser.signatures.assignSignatures(pkg.mSignatures);
565483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        addPackageSettingLPw(p, pkg.packageName, p.sharedUser);
567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Utility method that adds a PackageSetting to mPackages and
570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // completes updating the shared user attributes
571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void addPackageSettingLPw(PackageSetting p, String name,
572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            SharedUserSetting sharedUser) {
573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, p);
574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (sharedUser != null) {
575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null && p.sharedUser != sharedUser) {
576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Package " + p.name + " was user "
578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + p.sharedUser + " but is now " + sharedUser
579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + "; I am not changing its files so it will probably fail!");
580cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
581135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            } else if (p.appId != sharedUser.userId) {
582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
583135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    "Package " + p.name + " was user id " + p.appId
584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " but is now user " + sharedUser
585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " with id " + sharedUser.userId
586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "; I am not changing its files so it will probably fail!");
587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
589cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedUser.packages.add(p);
590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            p.sharedUser = sharedUser;
591135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            p.appId = sharedUser.userId;
592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /*
596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Update the shared user setting when a package using
597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * specifying the shared user id is removed. The gids
598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * associated with each permission of the deleted package
599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * are removed from the shared user's gid list only if its
600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * not in use by other permissions of packages in the
601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * shared user setting.
602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void updateSharedUserPermsLPw(PackageSetting deletedPs, int[] globalGids) {
604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if ((deletedPs == null) || (deletedPs.pkg == null)) {
605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Slog.i(PackageManagerService.TAG,
606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Trying to update info for null package. Just ignoring");
607cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
608cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // No sharedUserId
610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (deletedPs.sharedUser == null) {
611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting sus = deletedPs.sharedUser;
614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update permissions
615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (String eachPerm : deletedPs.pkg.requestedPermissions) {
616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            boolean used = false;
617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!sus.grantedPermissions.contains(eachPerm)) {
618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (PackageSetting pkg:sus.packages) {
621cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pkg.pkg != null &&
622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        !pkg.pkg.packageName.equals(deletedPs.pkg.packageName) &&
623cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkg.pkg.requestedPermissions.contains(eachPerm)) {
624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    used = true;
625cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    break;
626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
627cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!used) {
629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // can safely delete this permission from list
630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                sus.grantedPermissions.remove(eachPerm);
631cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
632cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
633cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Update gids
634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int newGids[] = globalGids;
635cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (String eachPerm : sus.grantedPermissions) {
636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BasePermission bp = mPermissions.get(eachPerm);
637cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp != null) {
638cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                newGids = PackageManagerService.appendInts(newGids, bp.gids);
639cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
641cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        sus.gids = newGids;
642cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
643cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
644447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    int removePackageLPw(String name) {
645447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
646cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
647cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mPackages.remove(name);
648cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
649cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
650cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p.sharedUser.packages.size() == 0) {
651cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSharedUsers.remove(p.sharedUser.name);
652447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    removeUserIdLPw(p.sharedUser.userId);
653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return p.sharedUser.userId;
654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
656135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                removeUserIdLPw(p.appId);
657135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                return p.appId;
658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return -1;
661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
663447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replacePackageLPw(String name, PackageSetting newp) {
664447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting p = mPackages.get(name);
665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (p != null) {
666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (p.sharedUser != null) {
667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.remove(p);
668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.sharedUser.packages.add(newp);
669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
670135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                replaceUserIdLPw(p.appId, newp);
671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
673cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPackages.put(name, newp);
674cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
675cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private boolean addUserIdLPw(int uid, Object obj, Object name) {
67721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid > Process.LAST_APPLICATION_UID) {
678cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
679cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
680cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
68121fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
682cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int N = mUserIds.size();
68321fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while (index >= N) {
685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.add(null);
686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                N++;
687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(index) != null) {
689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate user id: " + uid
691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mUserIds.set(index, obj);
695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mOtherUserIds.get(uid) != null) {
697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR,
698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Adding duplicate shared id: " + uid
699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " name=" + name);
700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
702cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public Object getUserIdLPr(int uid) {
70821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
709cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
71021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
711cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return index < N ? mUserIds.get(index) : null;
712cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return mOtherUserIds.get(uid);
714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
717447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void removeUserIdLPw(int uid) {
71821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
72021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, null);
722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.remove(uid);
724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
727447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void replaceUserIdLPw(int uid, Object obj) {
72821fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (uid >= Process.FIRST_APPLICATION_UID) {
729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final int N = mUserIds.size();
73021fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn            final int index = uid - Process.FIRST_APPLICATION_UID;
731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (index < N) mUserIds.set(index, obj);
732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
733cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mOtherUserIds.put(uid, obj);
734cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
735cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
736cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
7376309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    PreferredIntentResolver editPreferredActivitiesLPw(int userId) {
7386309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        PreferredIntentResolver pir = mPreferredActivities.get(userId);
7396309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        if (pir == null) {
7406309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            pir = new PreferredIntentResolver();
7416309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            mPreferredActivities.put(userId, pir);
7426309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        }
7436309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        return pir;
7446309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    }
7456309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
746483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private File getUserPackagesStateFile(int userId) {
74761f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        return new File(Environment.getUserSystemDirectory(userId), "package-restrictions.xml");
748483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
749483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
750483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private File getUserPackagesStateBackupFile(int userId) {
75161f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani        return new File(Environment.getUserSystemDirectory(userId),
75261f57379ca2c5b6290c8da7548fa17128f7ab24fAmith Yamasani                "package-restrictions-backup.xml");
753483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
754483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
755483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void writeAllUsersPackageRestrictionsLPr() {
756483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        List<UserInfo> users = getAllUsers();
757483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (users == null) return;
758483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
759483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        for (UserInfo user : users) {
760483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            writePackageRestrictionsLPr(user.id);
761483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
762483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
763483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
764483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void readAllUsersPackageRestrictionsLPr() {
765483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        List<UserInfo> users = getAllUsers();
766483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (users == null) {
767483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            readPackageRestrictionsLPr(0);
768483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            return;
769483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
770483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
771483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        for (UserInfo user : users) {
772483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            readPackageRestrictionsLPr(user.id);
773483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
774483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
775483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
7766309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    private void readPreferredActivitiesLPw(XmlPullParser parser, int userId)
7776309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            throws XmlPullParserException, IOException {
7786309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        int outerDepth = parser.getDepth();
7796309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        int type;
7806309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
7816309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
7826309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
7836309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                continue;
7846309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            }
7856309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
7866309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            String tagName = parser.getName();
7876309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            if (tagName.equals(TAG_ITEM)) {
7886309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                PreferredActivity pa = new PreferredActivity(parser);
7896309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                if (pa.mPref.getParseError() == null) {
7906309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    editPreferredActivitiesLPw(userId).addFilter(pa);
7916309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                } else {
7926309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    PackageManagerService.reportSettingsProblem(Log.WARN,
7936309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                            "Error in package manager settings: <preferred-activity> "
7946309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                                    + pa.mPref.getParseError() + " at "
7956309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                                    + parser.getPositionDescription());
7966309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                }
7976309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            } else {
7986309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                PackageManagerService.reportSettingsProblem(Log.WARN,
7996309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                        "Unknown element under <preferred-activities>: " + parser.getName());
8006309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                XmlUtils.skipCurrentTag(parser);
8016309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            }
8026309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        }
8036309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    }
8046309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
805483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void readPackageRestrictionsLPr(int userId) {
806258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        if (DEBUG_MU) {
807258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.i(TAG, "Reading package restrictions for user=" + userId);
808258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
809483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        FileInputStream str = null;
810483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File userPackagesStateFile = getUserPackagesStateFile(userId);
811483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File backupFile = getUserPackagesStateBackupFile(userId);
812483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (backupFile.exists()) {
813483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            try {
814483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                str = new FileInputStream(backupFile);
815483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                mReadMessages.append("Reading from backup stopped packages file\n");
816483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.INFO,
817483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "Need to read from backup stopped packages file");
818483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (userPackagesStateFile.exists()) {
819483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // If both the backup and normal file exist, we
820483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // ignore the normal one since it might have been
821483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // corrupted.
822483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
823483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + userPackagesStateFile);
824483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    userPackagesStateFile.delete();
825483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
826483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            } catch (java.io.IOException e) {
827483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                // We'll try for the normal settings file.
828483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
829483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
830483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
831483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        try {
832483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (str == null) {
833483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (!userPackagesStateFile.exists()) {
834483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    mReadMessages.append("No stopped packages file found\n");
835483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    PackageManagerService.reportSettingsProblem(Log.INFO,
836483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            "No stopped packages file; "
837483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            + "assuming all started");
838483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // At first boot, make sure no packages are stopped.
839483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    // We usually want to have third party apps initialize
8407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    // in the stopped state, but not at first boot.  Also
8417767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    // consider all applications to be installed.
842483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    for (PackageSetting pkg : mPackages.values()) {
8437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        pkg.setUserState(userId, COMPONENT_ENABLED_STATE_DEFAULT,
8447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                true,   // installed
8457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                false,  // stopped
8467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                false,  // notLaunched
8477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                null, null);
848483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
849483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    return;
850483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
851483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                str = new FileInputStream(userPackagesStateFile);
852483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
853483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final XmlPullParser parser = Xml.newPullParser();
854483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            parser.setInput(str, null);
855483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int type;
857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            while ((type=parser.next()) != XmlPullParser.START_TAG
858483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                       && type != XmlPullParser.END_DOCUMENT) {
859483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                ;
860483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
861483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
862483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (type != XmlPullParser.START_TAG) {
863483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                mReadMessages.append("No start tag found in package restrictions file\n");
864483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.WARN,
865483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "No start tag found in package manager stopped packages");
866483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                return;
867483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
868483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
869483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int outerDepth = parser.getDepth();
870483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageSetting ps = null;
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
879483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String tagName = parser.getName();
880483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_PACKAGE)) {
881483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
882483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    ps = mPackages.get(name);
883483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    if (ps == null) {
884483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        Slog.w(PackageManagerService.TAG, "No package known for stopped package: "
885483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                + name);
886483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        XmlUtils.skipCurrentTag(parser);
887483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        continue;
888483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
8897767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
8907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final int enabled = enabledStr == null
8917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            ? COMPONENT_ENABLED_STATE_DEFAULT : Integer.parseInt(enabledStr);
8927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final String installedStr = parser.getAttributeValue(null, ATTR_INSTALLED);
8937767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final boolean installed = installedStr == null
8947767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            ? true : Boolean.parseBoolean(installedStr);
8957767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final String stoppedStr = parser.getAttributeValue(null, ATTR_STOPPED);
8967767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final boolean stopped = stoppedStr == null
8977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            ? false : Boolean.parseBoolean(stoppedStr);
8987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final String notLaunchedStr = parser.getAttributeValue(null, ATTR_NOT_LAUNCHED);
8997767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    final boolean notLaunched = stoppedStr == null
9007767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            ? false : Boolean.parseBoolean(notLaunchedStr);
9017767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
9027767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    HashSet<String> enabledComponents = null;
9037767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    HashSet<String> disabledComponents = null;
904483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
905483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    int packageDepth = parser.getDepth();
906483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
907483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            && (type != XmlPullParser.END_TAG
908483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            || parser.getDepth() > packageDepth)) {
909483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (type == XmlPullParser.END_TAG
910483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                || type == XmlPullParser.TEXT) {
911483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            continue;
912483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
913483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        tagName = parser.getName();
914483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
9157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            enabledComponents = readComponentsLPr(parser);
916483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        } else if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
9177767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            disabledComponents = readComponentsLPr(parser);
918483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
919483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
9207767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
9217767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    ps.setUserState(userId, enabled, installed, stopped, notLaunched,
9227767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            enabledComponents, disabledComponents);
9236309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                } else if (tagName.equals("preferred-activities")) {
9246309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    readPreferredActivitiesLPw(parser, userId);
925483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                } else {
926483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
927483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                          + parser.getName());
928483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    XmlUtils.skipCurrentTag(parser);
929483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
930483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
931483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
932483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            str.close();
933483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
934483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (XmlPullParserException e) {
935483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mReadMessages.append("Error reading: " + e.toString());
936483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR,
937483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Error reading stopped packages: " + e);
938483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
939483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
940483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (java.io.IOException e) {
941483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            mReadMessages.append("Error reading: " + e.toString());
942483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
943483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
944483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
945483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
946483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
947483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private HashSet<String> readComponentsLPr(XmlPullParser parser)
948483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            throws IOException, XmlPullParserException {
9497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        HashSet<String> components = null;
950483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int type;
951483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int outerDepth = parser.getDepth();
952483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        String tagName;
953483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
954483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                && (type != XmlPullParser.END_TAG
955483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                || parser.getDepth() > outerDepth)) {
956483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (type == XmlPullParser.END_TAG
957483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    || type == XmlPullParser.TEXT) {
958483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                continue;
959483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
960483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            tagName = parser.getName();
961483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
962483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String componentName = parser.getAttributeValue(null, ATTR_NAME);
963483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (componentName != null) {
9647767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (components == null) {
9657767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        components = new HashSet<String>();
9667767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    }
967483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    components.add(componentName);
968483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                }
969483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
970483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
971483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return components;
972483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
973483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
9746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    void writePreferredActivitiesLPr(XmlSerializer serializer, int userId)
9756309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            throws IllegalArgumentException, IllegalStateException, IOException {
9766309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        serializer.startTag(null, "preferred-activities");
9776309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        PreferredIntentResolver pir = mPreferredActivities.get(userId);
9786309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        if (pir != null) {
9796309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            for (final PreferredActivity pa : pir.filterSet()) {
9806309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                serializer.startTag(null, TAG_ITEM);
9816309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                pa.writeToXml(serializer);
9826309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                serializer.endTag(null, TAG_ITEM);
9836309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            }
9846309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        }
9856309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        serializer.endTag(null, "preferred-activities");
9866309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    }
9876309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
988483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    void writePackageRestrictionsLPr(int userId) {
989258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        if (DEBUG_MU) {
990258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani            Log.i(TAG, "Writing package restrictions for user=" + userId);
991258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old stopped packages around until we know the new ones have
993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
994483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File userPackagesStateFile = getUserPackagesStateFile(userId);
995483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        File backupFile = getUserPackagesStateBackupFile(userId);
996483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        new File(userPackagesStateFile.getParent()).mkdirs();
997483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (userPackagesStateFile.exists()) {
998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist packages earlier. So preserve the older
1000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current packages
1001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
1002483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (!backupFile.exists()) {
1003483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (!userPackagesStateFile.renameTo(backupFile)) {
1004483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, "
1005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + "current changes will be lost at reboot");
1006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
1007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1009483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                userPackagesStateFile.delete();
1010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
1011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1015483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
1016447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final BufferedOutputStream str = new BufferedOutputStream(fstr);
1017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1018447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlSerializer serializer = new FastXmlSerializer();
1019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
1020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
1021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1023483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
1024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1025447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
10267767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                PackageUserState ustate = pkg.readUserState(userId);
10277767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                if (ustate.stopped || ustate.notLaunched || !ustate.installed
10287767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        || ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT
10297767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        || (ustate.enabledComponents != null
10307767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                && ustate.enabledComponents.size() > 0)
10317767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        || (ustate.disabledComponents != null
10327767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                && ustate.disabledComponents.size() > 0)) {
1033483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_PACKAGE);
1034483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, pkg.name);
10357767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (DEBUG_MU) Log.i(TAG, "  pkg=" + pkg.name + ", state=" + ustate.enabled);
10367767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
10377767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (!ustate.installed) {
10387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        serializer.attribute(null, ATTR_INSTALLED, "false");
10397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    }
10407767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (ustate.stopped) {
1041483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.attribute(null, ATTR_STOPPED, "true");
1042483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
10437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (ustate.notLaunched) {
1044483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
1045483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
10467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
10477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        serializer.attribute(null, ATTR_ENABLED,
10487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                                Integer.toString(ustate.enabled));
1049483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
10507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (ustate.enabledComponents != null
10517767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            && ustate.enabledComponents.size() > 0) {
1052483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.startTag(null, TAG_ENABLED_COMPONENTS);
10537767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        for (final String name : ustate.enabledComponents) {
1054483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.startTag(null, TAG_ITEM);
1055483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.attribute(null, ATTR_NAME, name);
1056483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.endTag(null, TAG_ITEM);
1057483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
1058483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.endTag(null, TAG_ENABLED_COMPONENTS);
1059483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
10607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    if (ustate.disabledComponents != null
10617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            && ustate.disabledComponents.size() > 0) {
1062483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.startTag(null, TAG_DISABLED_COMPONENTS);
10637767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        for (final String name : ustate.disabledComponents) {
1064483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.startTag(null, TAG_ITEM);
1065483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.attribute(null, ATTR_NAME, name);
1066483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            serializer.endTag(null, TAG_ITEM);
1067483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        }
1068483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        serializer.endTag(null, TAG_DISABLED_COMPONENTS);
1069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1070483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_PACKAGE);
1071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1073cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
10746309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            writePreferredActivitiesLPr(serializer, userId);
10756309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn
1076483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
1077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
1079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
1081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
1082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
1085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
1086483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            backupFile.delete();
1087483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            FileUtils.setPermissions(userPackagesStateFile.toString(),
1088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
108970522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
1090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Done, all is good!
1093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
1094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
1095483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.wtf(PackageManagerService.TAG,
1096483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Unable to write package manager user packages state, "
1097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + " current changes will be lost at reboot", e);
1098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
1101483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (userPackagesStateFile.exists()) {
1102483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (!userPackagesStateFile.delete()) {
1103483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
1104483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + mStoppedPackagesFilename);
1105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Note: assumed "stopped" field is already cleared in all packages.
1110483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    // Legacy reader, used to read in the old file format after an upgrade. Not used after that.
1111447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void readStoppedLPw() {
1112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupStoppedPackagesFilename.exists()) {
1114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupStoppedPackagesFilename);
1116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup stopped packages file\n");
1117483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                PackageManagerService.reportSettingsProblem(Log.INFO,
1118483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        "Need to read from backup stopped packages file");
1119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and normal file exist, we
1121cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the normal one since it might have been
1122cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up stopped packages file "
1124cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mStoppedPackagesFilename);
1125cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mStoppedPackagesFilename.delete();
1126cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1127cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1128cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1129cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1130cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1131cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1132cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1133cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1134cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mStoppedPackagesFilename.exists()) {
1135cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No stopped packages file found\n");
1136483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    PackageManagerService.reportSettingsProblem(Log.INFO,
1137483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            "No stopped packages file file; assuming all started");
1138cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // At first boot, make sure no packages are stopped.
1139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We usually want to have third party apps initialize
1140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // in the stopped state, but not at first boot.
1141cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    for (PackageSetting pkg : mPackages.values()) {
1142483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setStopped(false, 0);
1143483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pkg.setNotLaunched(false, 0);
1144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
1146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mStoppedPackagesFilename);
1148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1149447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final XmlPullParser parser = Xml.newPullParser();
1150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.START_TAG
1154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                       && type != XmlPullParser.END_DOCUMENT) {
1155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in stopped packages file\n");
1160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager stopped packages");
1162cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return;
1163cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1164cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1165cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1166cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
1167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                   && (type != XmlPullParser.END_TAG
1168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                           || parser.getDepth() > outerDepth)) {
1169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG
1170cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        || type == XmlPullParser.TEXT) {
1171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1175483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_PACKAGE)) {
1176483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
1177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageSetting ps = mPackages.get(name);
1178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (ps != null) {
1179483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        ps.setStopped(true, 0);
1180483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        if ("1".equals(parser.getAttributeValue(null, ATTR_NOT_LAUNCHED))) {
1181483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                            ps.setNotLaunched(true, 0);
1182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1183cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } else {
1184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        Slog.w(PackageManagerService.TAG,
1185483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                                "No package known for stopped package: " + name);
1186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: "
1190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                          + parser.getName());
1191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1194cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1195cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1197483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (XmlPullParserException e) {
1198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1199483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageManagerService.reportSettingsProblem(Log.ERROR,
1200483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    "Error reading stopped packages: " + e);
1201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1203483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (java.io.IOException e) {
1204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager stopped packages", e);
1207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1211447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeLPr() {
1212cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
1213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Keep the old settings around until we know the new ones have
1215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // been successfully written.
1216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Presence of backup settings file indicates that we failed
1218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // to persist settings earlier. So preserve the older
1219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // backup for future reference since the current settings
1220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // might have been corrupted.
1221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mBackupSettingsFilename.exists()) {
1222cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.renameTo(mBackupSettingsFilename)) {
1223cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.wtf(PackageManagerService.TAG, "Unable to backup package manager settings, "
1224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " current changes will be lost at reboot");
1225cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return;
1226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mSettingsFilename.delete();
1229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Slog.w(PackageManagerService.TAG, "Preserving older settings backup");
1230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
1237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            BufferedOutputStream str = new BufferedOutputStream(fstr);
1238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1239cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //XmlSerializer serializer = XmlUtils.serializerInstance();
1240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlSerializer serializer = new FastXmlSerializer();
1241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setOutput(str, "utf-8");
1242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startDocument(null, true);
1243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
1244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1245cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "packages");
1246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "last-platform-version");
1248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
1249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
1250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "last-platform-version");
1251edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
12520aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            if (mVerifierDeviceIdentity != null) {
12530aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.startTag(null, "verifier");
12540aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
12550aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                serializer.endTag(null, "verifier");
12560aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            }
12570aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
1258f53857716a0db805c51c0cae93550d90e32e4749Jeff Sharkey            if (mReadExternalStorageEnforced != null) {
1259edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
1260edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.attribute(
12615d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                        null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
1262edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
1263edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey            }
1264edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey
1265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permission-trees");
1266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissionTrees.values()) {
1267447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
1268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permission-trees");
1270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "permissions");
1272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (BasePermission bp : mPermissions.values()) {
1273447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePermissionLPr(serializer, bp);
1274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "permissions");
1276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1277447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mPackages.values()) {
1278447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writePackageLPr(serializer, pkg);
1279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1281447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting pkg : mDisabledSysPackages.values()) {
1282447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                writeDisabledSysPackageLPr(serializer, pkg);
1283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1285447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final SharedUserSetting usr : mSharedUsers.values()) {
1286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "shared-user");
1287483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                serializer.attribute(null, ATTR_NAME, usr.name);
1288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "userId",
1289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Integer.toString(usr.userId));
1290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
1291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.startTag(null, "perms");
1292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (String name : usr.grantedPermissions) {
1293483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1294483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1295483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "perms");
1298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.endTag(null, "shared-user");
1299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1300cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mPackagesToBeCleaned.size() > 0) {
1302752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                for (PackageCleanItem item : mPackagesToBeCleaned) {
1303752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    final String userStr = Integer.toString(item.userId);
1304752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    serializer.startTag(null, "cleaning-package");
1305752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    serializer.attribute(null, ATTR_NAME, item.packageName);
1306752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    serializer.attribute(null, ATTR_CODE, item.andCode ? "true" : "false");
1307752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    serializer.attribute(null, ATTR_USER, userStr);
1308752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                    serializer.endTag(null, "cleaning-package");
1309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1311cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1312cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mRenamedPackages.size() > 0) {
13132f36229db823d152f3efd879e751e81a601a75b0Andy McFadden                for (Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
1314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.startTag(null, "renamed-package");
1315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "new", e.getKey());
1316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "old", e.getValue());
1317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.endTag(null, "renamed-package");
1318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "packages");
1322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endDocument();
1324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.flush();
1326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.sync(fstr);
1327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1328cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1329cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // New settings successfully written, old ones are no longer
1330cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // needed.
1331cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mBackupSettingsFilename.delete();
1332cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mSettingsFilename.toString(),
1333cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
133470522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
1335cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1336cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1337cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // Write package list file now, use a JournaledFile.
1338cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            //
1339cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            File tempFile = new File(mPackageListFilename.toString() + ".tmp");
1340cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
1341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            fstr = new FileOutputStream(journal.chooseForWrite());
1343cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str = new BufferedOutputStream(fstr);
1344cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1345cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                StringBuilder sb = new StringBuilder();
1346447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (final PackageSetting pkg : mPackages.values()) {
1347cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ApplicationInfo ai = pkg.pkg.applicationInfo;
1348cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String dataPath = ai.dataDir;
1349cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    boolean isDebug  = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
1350cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1351cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Avoid any application that has a space in its path
1352cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // or that is handled by the system.
13531358ebe46c47a8c5d80d3f9bc4768805ac80ca46Magnus Eriksson                    if (dataPath.indexOf(" ") >= 0 || ai.uid < Process.FIRST_APPLICATION_UID)
1354cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        continue;
1355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1356cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // we store on each line the following information for now:
1357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // pkgName    - package name
1359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // userId     - application-specific user id
1360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // debugFlag  - 0 or 1 if the package is debuggable.
1361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // dataPath   - path to package's data path
1362cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // NOTE: We prefer not to expose all ApplicationInfo flags for now.
1364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
1366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
1367cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //   system/core/run-as/run-as.c
1368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    //
1369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.setLength(0);
1370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(ai.packageName);
1371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(" ");
1372cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append((int)ai.uid);
1373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(isDebug ? " 1 " : " 0 ");
1374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append(dataPath);
1375cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    sb.append("\n");
1376cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    str.write(sb.toString().getBytes());
1377cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1378cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.flush();
1379cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                FileUtils.sync(fstr);
1380cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str.close();
1381cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.commit();
138262539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root            } catch (Exception e) {
138362539e9efa02c4037d3310a8b4f16f0085cd8c37Kenny Root                IoUtils.closeQuietly(str);
1384cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                journal.rollback();
1385cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1386cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1387cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            FileUtils.setPermissions(mPackageListFilename.toString(),
1388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    FileUtils.S_IRUSR|FileUtils.S_IWUSR
138970522addd031f6c667849f76c074e463a141c61dNick Kralevich                    |FileUtils.S_IRGRP|FileUtils.S_IWGRP,
1390cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    -1, -1);
1391cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1392483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            writeAllUsersPackageRestrictionsLPr();
1393cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return;
1394cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(XmlPullParserException e) {
1396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1398cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch(java.io.IOException e) {
1399cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Unable to write package manager settings, "
1400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    + "current changes will be lost at reboot", e);
1401cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1402cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Clean up partially written files
1403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mSettingsFilename.exists()) {
1404cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (!mSettingsFilename.delete()) {
1405483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                Log.wtf(PackageManagerService.TAG, "Failed to clean up mangled file: "
1406483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        + mSettingsFilename);
1407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        //Debug.stopMethodTracing();
1410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1411cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1412447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1413cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "updated-package");
1415483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        serializer.attribute(null, ATTR_NAME, pkg.name);
1416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1418cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1419cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1422cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1423cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1428cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1429cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1430cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1431135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "userId", Integer.toString(pkg.appId));
1432cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1433135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
1434cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1435cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "perms");
1436cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1437cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // If this is a shared user, the permissions will
1438cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be written there. We still need to write an
1439cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // empty permissions list so permissionsFixed will
1440cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            // be set.
1441cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            for (final String name : pkg.grantedPermissions) {
1442cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                BasePermission bp = mPermissions.get(name);
1443cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (bp != null) {
1444cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // We only need to write signature or system permissions but
1445cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // this wont
1446cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // match the semantics of grantedPermissions. So write all
1447cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // permissions.
1448483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1449483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1450483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1451cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1452cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1453cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1454cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "perms");
1455cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "updated-package");
1456cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1457cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePackageLPr(XmlSerializer serializer, final PackageSetting pkg)
1459cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws java.io.IOException {
1460cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.startTag(null, "package");
1461483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        serializer.attribute(null, ATTR_NAME, pkg.name);
1462cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.realName != null) {
1463cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "realName", pkg.realName);
1464cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1465cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "codePath", pkg.codePathString);
1466cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (!pkg.resourcePathString.equals(pkg.codePathString)) {
1467cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "resourcePath", pkg.resourcePathString);
1468cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1469cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.nativeLibraryPathString != null) {
1470cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "nativeLibraryPath", pkg.nativeLibraryPathString);
1471cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1472cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "flags", Integer.toString(pkg.pkgFlags));
1473cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ft", Long.toHexString(pkg.timeStamp));
1474cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "it", Long.toHexString(pkg.firstInstallTime));
1475cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "ut", Long.toHexString(pkg.lastUpdateTime));
1476cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
1477cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.sharedUser == null) {
1478135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "userId", Integer.toString(pkg.appId));
1479cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1480135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            serializer.attribute(null, "sharedUserId", Integer.toString(pkg.appId));
1481cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1482cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.uidError) {
1483cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "uidError", "true");
1484cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1485cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installStatus == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1486cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installStatus", "false");
1487cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1488cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (pkg.installerPackageName != null) {
1489cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "installer", pkg.installerPackageName);
1490cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1491cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkg.signatures.writeXml(serializer, "sigs", mPastSignatures);
1492cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((pkg.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
1493cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.startTag(null, "perms");
1494cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (pkg.sharedUser == null) {
1495cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // If this is a shared user, the permissions will
1496cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be written there. We still need to write an
1497cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // empty permissions list so permissionsFixed will
1498cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // be set.
1499cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                for (final String name : pkg.grantedPermissions) {
1500483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.startTag(null, TAG_ITEM);
1501483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.attribute(null, ATTR_NAME, name);
1502483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    serializer.endTag(null, TAG_ITEM);
1503cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1504cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1505cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.endTag(null, "perms");
1506cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1507cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1508cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        serializer.endTag(null, "package");
1509cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1510cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1511447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void writePermissionLPr(XmlSerializer serializer, BasePermission bp)
1512cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws XmlPullParserException, java.io.IOException {
1513cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (bp.type != BasePermission.TYPE_BUILTIN && bp.sourcePackage != null) {
1514483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.startTag(null, TAG_ITEM);
1515483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.attribute(null, ATTR_NAME, bp.name);
1516cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            serializer.attribute(null, "package", bp.sourcePackage);
1517cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) {
1518cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel));
1519cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1520cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
1521cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type="
1522cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + bp.type);
1523cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (bp.type == BasePermission.TYPE_DYNAMIC) {
1524447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo;
1525cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (pi != null) {
1526cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    serializer.attribute(null, "type", "dynamic");
1527cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.icon != 0) {
1528cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "icon", Integer.toString(pi.icon));
1529cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1530cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (pi.nonLocalizedLabel != null) {
1531cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        serializer.attribute(null, "label", pi.nonLocalizedLabel.toString());
1532cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1533cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1534cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1535483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            serializer.endTag(null, TAG_ITEM);
1536cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1537cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1538cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1539447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    ArrayList<PackageSetting> getListOfIncompleteInstallPackagesLPr() {
1540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final HashSet<String> kList = new HashSet<String>(mPackages.keySet());
1541447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Iterator<String> its = kList.iterator();
1542447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final ArrayList<PackageSetting> ret = new ArrayList<PackageSetting>();
1543cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while (its.hasNext()) {
1544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String key = its.next();
1545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final PackageSetting ps = mPackages.get(key);
1546cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (ps.getInstallStatus() == PackageSettingBase.PKG_INSTALL_INCOMPLETE) {
1547cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ret.add(ps);
1548cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1549cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1550cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return ret;
1551cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1552cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1553752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey    void addPackageToCleanLPw(PackageCleanItem pkg) {
1554752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey        if (!mPackagesToBeCleaned.contains(pkg)) {
1555752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey            mPackagesToBeCleaned.add(pkg);
15567767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        }
15577767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
15587767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
1559483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean readLPw(List<UserInfo> users) {
1560cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        FileInputStream str = null;
1561cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (mBackupSettingsFilename.exists()) {
1562cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1563cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mBackupSettingsFilename);
1564cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("Reading from backup settings file\n");
1565cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.INFO,
1566cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Need to read from backup settings file");
1567cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (mSettingsFilename.exists()) {
1568cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // If both the backup and settings file exist, we
1569cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // ignore the settings since it might have been
1570cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // corrupted.
1571cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Cleaning up settings file "
1572cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + mSettingsFilename);
1573cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mSettingsFilename.delete();
1574cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1575cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (java.io.IOException e) {
1576cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // We'll try for the normal settings file.
1577cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1578cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1579cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        mPendingPackages.clear();
1581cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPastSignatures.clear();
1582cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1583cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1584cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (str == null) {
1585cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (!mSettingsFilename.exists()) {
1586cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mReadMessages.append("No settings file found\n");
1587cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.INFO,
1588cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "No settings file; creating initial state");
15896309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    readDefaultPreferredAppsLPw(0);
1590cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    return false;
1591cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1592cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                str = new FileInputStream(mSettingsFilename);
1593cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1594cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlPullParser parser = Xml.newPullParser();
1595cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            parser.setInput(str, null);
1596cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1597cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
1598cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.START_TAG
1599cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && type != XmlPullParser.END_DOCUMENT) {
1600cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ;
1601cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1602cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1603cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type != XmlPullParser.START_TAG) {
1604cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append("No start tag found in settings file\n");
1605cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1606cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "No start tag found in package manager settings");
160758f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                Log.wtf(PackageManagerService.TAG,
160858f42a59bda3bc912d0d2f81dc65a9d31d140eaaDianne Hackborn                        "No start tag found in package manager settings");
1609cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return false;
1610cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1611cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1612cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
1613cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1614cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1615cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1616cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1617cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1618cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1619cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
1620cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("package")) {
1621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPackageLPw(parser);
1622cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permissions")) {
1623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissions, parser);
1624cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("permission-trees")) {
1625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readPermissionsLPw(mPermissionTrees, parser);
1626cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("shared-user")) {
1627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readSharedUserLPw(parser);
1628cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-packages")) {
1629cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // no longer used.
1630cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("preferred-activities")) {
16316309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    // Upgrading from old single-user implementation;
16326309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    // these are the preferred activities for user 0.
16336309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    readPreferredActivitiesLPw(parser, 0);
1634cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("updated-package")) {
1635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readDisabledSysPackageLPw(parser);
1636cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("cleaning-package")) {
1637483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    String name = parser.getAttributeValue(null, ATTR_NAME);
16387767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    String userStr = parser.getAttributeValue(null, ATTR_USER);
16397767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    String codeStr = parser.getAttributeValue(null, ATTR_CODE);
1640cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (name != null) {
1641752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                        int userId = 0;
16427767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        boolean andCode = true;
16437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        try {
16447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            if (userStr != null) {
1645752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                                userId = Integer.parseInt(userStr);
16467767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            }
16477767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        } catch (NumberFormatException e) {
16487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        }
16497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        if (codeStr != null) {
16507767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            andCode = Boolean.parseBoolean(codeStr);
16517767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        }
1652752cd922f7091dfd5401faf70dc248934a9dbb6dJeff Sharkey                        addPackageToCleanLPw(new PackageCleanItem(userId, name, andCode));
1653cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1654cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("renamed-package")) {
1655cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String nname = parser.getAttributeValue(null, "new");
1656cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    String oname = parser.getAttributeValue(null, "old");
1657cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (nname != null && oname != null) {
1658cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        mRenamedPackages.put(nname, oname);
1659cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1660cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("last-platform-version")) {
1661cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mInternalSdkPlatform = mExternalSdkPlatform = 0;
1662cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
1663cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String internal = parser.getAttributeValue(null, "internal");
1664cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (internal != null) {
1665cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mInternalSdkPlatform = Integer.parseInt(internal);
1666cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1667cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        String external = parser.getAttributeValue(null, "external");
1668cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        if (external != null) {
1669cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            mExternalSdkPlatform = Integer.parseInt(external);
1670cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        }
1671cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
1672cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
16730aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                } else if (tagName.equals("verifier")) {
16740aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    final String deviceIdentity = parser.getAttributeValue(null, "device");
16750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    try {
16760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        mVerifierDeviceIdentity = VerifierDeviceIdentity.parse(deviceIdentity);
16770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    } catch (IllegalArgumentException e) {
16780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                        Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
16790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                                + e.getMessage());
16800aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root                    }
1681edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
1682edc84ee8392afa0102f098168329db5bb43a6d4bJeff Sharkey                    final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
16835d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                    mReadExternalStorageEnforced = "1".equals(enforcement);
1684cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1685cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
1686cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getName());
1687cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
1688cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1689cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1690cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1691cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            str.close();
1692cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1693cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (XmlPullParserException e) {
1694cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1695cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1696cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1697cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1698cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (java.io.IOException e) {
1699cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            mReadMessages.append("Error reading: " + e.toString());
1700cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
1701cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.wtf(PackageManagerService.TAG, "Error reading package manager settings", e);
1702258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        }
1703cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1704cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mPendingPackages.size();
1705cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
1706cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final PendingPackage pp = mPendingPackages.get(i);
1707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            Object idObj = getUserIdLPr(pp.sharedId);
1708cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (idObj != null && idObj instanceof SharedUserSetting) {
1709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                PackageSetting p = getPackageLPw(pp.name, null, pp.realName,
1710cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
17117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                        pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags,
1712f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                        null, true /* add */, false /* allowInstall */);
1713cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (p == null) {
1714cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1715cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unable to create application package for " + pp.name);
1716cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
1717cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1718cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                p.copyFrom(pp);
1719cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (idObj != null) {
1720cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1721cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not a shared uid\n";
1722cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1723cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1724cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1725cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String msg = "Bad package setting: package " + pp.name + " has shared uid "
1726cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + pp.sharedId + " that is not defined\n";
1727cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mReadMessages.append(msg);
1728cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.ERROR, msg);
1729cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1730cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1731cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mPendingPackages.clear();
1732cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1733f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani        if (mBackupStoppedPackagesFilename.exists()
1734f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                || mStoppedPackagesFilename.exists()) {
1735f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            // Read old file
1736f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            readStoppedLPw();
1737f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            mBackupStoppedPackagesFilename.delete();
1738f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            mStoppedPackagesFilename.delete();
1739f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            // Migrate to new file format
1740f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            writePackageRestrictionsLPr(0);
1741f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani        } else {
1742f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            if (users == null) {
1743f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                readPackageRestrictionsLPr(0);
1744f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            } else {
1745f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                for (UserInfo user : users) {
1746f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                    readPackageRestrictionsLPr(user.id);
1747f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani                }
1748f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani            }
1749f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani        }
1750f031f230f5e42613dab6b30431fac9b2839d68e6Amith Yamasani
17511d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        /*
17521d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * Make sure all the updated system packages have their shared users
17531d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         * associated with them.
17541d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root         */
17551d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        final Iterator<PackageSetting> disabledIt = mDisabledSysPackages.values().iterator();
17561d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        while (disabledIt.hasNext()) {
17571d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            final PackageSetting disabledPs = disabledIt.next();
1758135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            final Object id = getUserIdLPr(disabledPs.appId);
17591d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            if (id != null && id instanceof SharedUserSetting) {
17601d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root                disabledPs.sharedUser = (SharedUserSetting) id;
17611d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root            }
17621d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root        }
17631d1b4893762c8daad2b31dc79cad2dbcc1b251d2Kenny Root
1764cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mReadMessages.append("Read completed successfully: " + mPackages.size() + " packages, "
1765cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                + mSharedUsers.size() + " shared uids\n");
1766cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1767cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return true;
1768cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1769cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
17706309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    private void readDefaultPreferredAppsLPw(int userId) {
1771fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        // Read preferred apps from .../etc/preferred-apps directory.
1772fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps");
1773fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        if (!preferredDir.exists() || !preferredDir.isDirectory()) {
1774fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            return;
1775fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1776fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        if (!preferredDir.canRead()) {
1777fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            Slog.w(TAG, "Directory " + preferredDir + " cannot be read");
1778fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            return;
1779fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1780fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1781fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        // Iterate over the files in the directory and scan .xml files
1782fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        for (File f : preferredDir.listFiles()) {
1783fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            if (!f.getPath().endsWith(".xml")) {
1784fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.i(TAG, "Non-xml file " + f + " in " + preferredDir + " directory, ignoring");
1785fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                continue;
1786fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1787fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            if (!f.canRead()) {
1788fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Preferred apps file " + f + " cannot be read");
1789fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                continue;
1790fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1791fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1792fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            FileInputStream str = null;
1793fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            try {
1794fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                str = new FileInputStream(f);
1795fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                XmlPullParser parser = Xml.newPullParser();
1796fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                parser.setInput(str, null);
1797fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1798fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                int type;
1799fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                while ((type = parser.next()) != XmlPullParser.START_TAG
1800fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                        && type != XmlPullParser.END_DOCUMENT) {
1801fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    ;
1802fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1803fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1804fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (type != XmlPullParser.START_TAG) {
1805fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    Slog.w(TAG, "Preferred apps file " + f + " does not have start tag");
1806fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    continue;
1807fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1808fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (!"preferred-activities".equals(parser.getName())) {
1809fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    Slog.w(TAG, "Preferred apps file " + f
1810fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                            + " does not start with 'preferred-activities'");
1811fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    continue;
1812fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
18136309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                readPreferredActivitiesLPw(parser, userId);
1814fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } catch (XmlPullParserException e) {
1815fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Error reading apps file " + f, e);
1816fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } catch (IOException e) {
1817fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                Slog.w(TAG, "Error reading apps file " + f, e);
1818fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            } finally {
1819fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                if (str != null) {
1820fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    try {
1821fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                        str.close();
1822fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    } catch (IOException e) {
1823fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                    }
1824fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn                }
1825fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn            }
1826fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn        }
1827fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn    }
1828fc8b7fe02630f64a1d6c8ecb06f4c250e7478f1dDianne Hackborn
1829cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    private int readInt(XmlPullParser parser, String ns, String name, int defValue) {
1830cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String v = parser.getAttributeValue(ns, name);
1831cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1832cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (v == null) {
1833cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                return defValue;
1834cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1835cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return Integer.parseInt(v);
1836cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
1837cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
1838cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: attribute " + name
1839cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + " has bad integer value " + v + " at "
1840cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
1841cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1842cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return defValue;
1843cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1844cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1845447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPermissionsLPw(HashMap<String, BasePermission> out, XmlPullParser parser)
1846cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
1847cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1848cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1849cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1850cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1851cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1852cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1853cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1854cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1855447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            final String tagName = parser.getName();
1856483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
1857483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                final String name = parser.getAttributeValue(null, ATTR_NAME);
1858447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String sourcePackage = parser.getAttributeValue(null, "package");
1859447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                final String ptype = parser.getAttributeValue(null, "type");
1860cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null && sourcePackage != null) {
1861447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final boolean dynamic = "dynamic".equals(ptype);
1862447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    final BasePermission bp = new BasePermission(name, sourcePackage,
1863cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL);
1864cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    bp.protectionLevel = readInt(parser, null, "protection",
1865cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            PermissionInfo.PROTECTION_NORMAL);
1866e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel);
1867cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (dynamic) {
1868cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        PermissionInfo pi = new PermissionInfo();
1869cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.packageName = sourcePackage.intern();
1870cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.name = name.intern();
1871cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.icon = readInt(parser, null, "icon", 0);
1872cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.nonLocalizedLabel = parser.getAttributeValue(null, "label");
1873cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pi.protectionLevel = bp.protectionLevel;
1874cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        bp.pendingInfo = pi;
1875cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
1876cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    out.put(bp.name, bp);
1877cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
1878cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
1879cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: permissions has" + " no name at "
1880cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
1881cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1882cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1883cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1884cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element reading permissions: " + parser.getName() + " at "
1885cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
1886cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1887cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
1888cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1889cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1890cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1891447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException,
1892cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            IOException {
1893483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        String name = parser.getAttributeValue(null, ATTR_NAME);
1894cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = parser.getAttributeValue(null, "realName");
1895cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = parser.getAttributeValue(null, "codePath");
1896cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1897cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1898cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (resourcePathStr == null) {
1899cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = codePathStr;
1900cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1901cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = parser.getAttributeValue(null, "version");
1902cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1903cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (version != null) {
1904cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1905cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                versionCode = Integer.parseInt(version);
1906cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1907cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1908cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1909cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1910cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1911cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
1912cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSetting ps = new PackageSetting(name, realName, new File(codePathStr),
1913cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                new File(resourcePathStr), nativeLibraryPathStr, versionCode, pkgFlags);
1914cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String timeStampStr = parser.getAttributeValue(null, "ft");
1915cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1916cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1917cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                long timeStamp = Long.parseLong(timeStampStr, 16);
1918cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.setTimeStamp(timeStamp);
1919cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1920cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1921cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
1922cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ts");
1923cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
1924cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
1925cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    long timeStamp = Long.parseLong(timeStampStr);
1926cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    ps.setTimeStamp(timeStamp);
1927cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
1928cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
1929cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1930cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1931cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "it");
1932cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1933cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1934cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.firstInstallTime = Long.parseLong(timeStampStr, 16);
1935cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1936cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1937cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1938cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        timeStampStr = parser.getAttributeValue(null, "ut");
1939cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (timeStampStr != null) {
1940cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            try {
1941cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                ps.lastUpdateTime = Long.parseLong(timeStampStr, 16);
1942cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } catch (NumberFormatException e) {
1943cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1944cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1945cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = parser.getAttributeValue(null, "userId");
1946135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        ps.appId = idStr != null ? Integer.parseInt(idStr) : 0;
1947135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        if (ps.appId <= 0) {
1948cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1949135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            ps.appId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
1950cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1951cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
1952cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
1953cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1954cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1955cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1956cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
1957cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1958cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1959cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
1960cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (tagName.equals("perms")) {
1961447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                readGrantedPermissionsLPw(parser, ps.grantedPermissions);
1962cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
1963cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
1964cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <updated-package>: " + parser.getName());
1965cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                XmlUtils.skipCurrentTag(parser);
1966cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
1967cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
1968cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mDisabledSysPackages.put(name, ps);
1969cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
1970cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
1971447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException {
1972cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
1973cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String realName = null;
1974cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
1975cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String sharedIdStr = null;
1976cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String codePathStr = null;
1977cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String resourcePathStr = null;
1978cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String nativeLibraryPathStr = null;
1979cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String systemStr = null;
1980cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String installerPackageName = null;
1981cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String uidError = null;
1982cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
1983cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long timeStamp = 0;
1984cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long firstInstallTime = 0;
1985cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        long lastUpdateTime = 0;
1986cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        PackageSettingBase packageSetting = null;
1987cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String version = null;
1988cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int versionCode = 0;
1989cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
1990483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            name = parser.getAttributeValue(null, ATTR_NAME);
1991cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            realName = parser.getAttributeValue(null, "realName");
1992cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
1993cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            uidError = parser.getAttributeValue(null, "uidError");
1994cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
1995cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            codePathStr = parser.getAttributeValue(null, "codePath");
1996cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            resourcePathStr = parser.getAttributeValue(null, "resourcePath");
1997cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            nativeLibraryPathStr = parser.getAttributeValue(null, "nativeLibraryPath");
1998cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            version = parser.getAttributeValue(null, "version");
1999cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (version != null) {
2000cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
2001cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    versionCode = Integer.parseInt(version);
2002cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
2003cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2004cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2005cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            installerPackageName = parser.getAttributeValue(null, "installer");
2006cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2007cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            systemStr = parser.getAttributeValue(null, "flags");
2008cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (systemStr != null) {
2009cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
2010cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags = Integer.parseInt(systemStr);
2011cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
2012cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2013cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2014cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                // For backward compatibility
2015cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                systemStr = parser.getAttributeValue(null, "system");
2016cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (systemStr != null) {
2017cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ("true".equalsIgnoreCase(systemStr)) ? ApplicationInfo.FLAG_SYSTEM
2018cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            : 0;
2019cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2020cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // Old settings that don't specify system... just treat
2021cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    // them as system, good enough.
2022cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
2023cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2024cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2025cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String timeStampStr = parser.getAttributeValue(null, "ft");
2026cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
2027cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
2028cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    timeStamp = Long.parseLong(timeStampStr, 16);
2029cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
2030cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2031cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2032cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                timeStampStr = parser.getAttributeValue(null, "ts");
2033cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (timeStampStr != null) {
2034cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    try {
2035cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        timeStamp = Long.parseLong(timeStampStr);
2036cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    } catch (NumberFormatException e) {
2037cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    }
2038cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2039cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2040cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "it");
2041cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
2042cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
2043cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    firstInstallTime = Long.parseLong(timeStampStr, 16);
2044cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
2045cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2046cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2047cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            timeStampStr = parser.getAttributeValue(null, "ut");
2048cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (timeStampStr != null) {
2049cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                try {
2050cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    lastUpdateTime = Long.parseLong(timeStampStr, 16);
2051cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } catch (NumberFormatException e) {
2052cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2053cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2054cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (PackageManagerService.DEBUG_SETTINGS)
2055cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                Log.v(PackageManagerService.TAG, "Reading package: " + name + " userId=" + idStr
2056cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        + " sharedUserId=" + sharedIdStr);
2057cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
2058cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (resourcePathStr == null) {
2059cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                resourcePathStr = codePathStr;
2060cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2061cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (realName != null) {
2062cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                realName = realName.intern();
2063cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2064cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
2065cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2066cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no name at "
2067cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2068cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (codePathStr == null) {
2069cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2070cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <package> has no codePath at "
2071cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2072cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId > 0) {
2073447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
2074cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
2075cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        pkgFlags);
2076cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (PackageManagerService.DEBUG_SETTINGS)
2077cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    Log.i(PackageManagerService.TAG, "Reading package " + name + ": userId="
2078cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " pkg=" + packageSetting);
2079cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (packageSetting == null) {
2080cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.ERROR, "Failure adding uid "
2081cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + userId + " while parsing settings at "
2082cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + parser.getPositionDescription());
2083cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2084cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
2085cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
2086cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
2087cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2088cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (sharedIdStr != null) {
2089cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
2090cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (userId > 0) {
2091cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting = new PendingPackage(name.intern(), realName, new File(
2092cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
2093cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            versionCode, pkgFlags);
2094cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.setTimeStamp(timeStamp);
2095cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.firstInstallTime = firstInstallTime;
2096cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.lastUpdateTime = lastUpdateTime;
2097cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    mPendingPackages.add((PendingPackage) packageSetting);
2098cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    if (PackageManagerService.DEBUG_SETTINGS)
2099cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        Log.i(PackageManagerService.TAG, "Reading package " + name
2100cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + ": sharedUserId=" + userId + " pkg=" + packageSetting);
2101cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2102cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2103cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: package " + name
2104cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " has bad sharedId " + sharedIdStr + " at "
2105cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2106cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2107cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2108cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2109cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: package " + name + " has bad userId "
2110cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + idStr + " at " + parser.getPositionDescription());
2111cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2112cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
2113cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
2114cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
2115cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
2116cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2117cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSetting != null) {
2118cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.uidError = "true".equals(uidError);
2119cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.installerPackageName = installerPackageName;
2120cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            packageSetting.nativeLibraryPathString = nativeLibraryPathStr;
2121483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // Handle legacy string here for single-user mode
2122483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            final String enabledStr = parser.getAttributeValue(null, ATTR_ENABLED);
2123cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (enabledStr != null) {
2124b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                try {
2125483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.setEnabled(Integer.parseInt(enabledStr), 0 /* userId */);
2126b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                } catch (NumberFormatException e) {
2127b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    if (enabledStr.equalsIgnoreCase("true")) {
2128483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 0);
2129b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("false")) {
2130483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0);
2131b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else if (enabledStr.equalsIgnoreCase("default")) {
2132483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
2133b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    } else {
2134b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                        PackageManagerService.reportSettingsProblem(Log.WARN,
2135b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                "Error in package manager settings: package " + name
2136b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + " has bad enabled value: " + idStr + " at "
2137b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                                        + parser.getPositionDescription());
2138b8f400020b201cc40f5e16277af0dbafec38b8a3Dianne Hackborn                    }
2139cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2140cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2141483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                packageSetting.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, 0);
2142cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2143483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2144cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            final String installStatusStr = parser.getAttributeValue(null, "installStatus");
2145cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (installStatusStr != null) {
2146cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (installStatusStr.equalsIgnoreCase("false")) {
2147cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_INCOMPLETE;
2148cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2149cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.installStatus = PackageSettingBase.PKG_INSTALL_COMPLETE;
2150cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2151cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2152cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2153cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
2154cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
2155cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2156cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2157cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2158cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
2159cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2160cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2161cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
2162483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                // Legacy
2163483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                if (tagName.equals(TAG_DISABLED_COMPONENTS)) {
2164483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    readDisabledComponentsLPw(packageSetting, parser, 0);
2165483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                } else if (tagName.equals(TAG_ENABLED_COMPONENTS)) {
2166483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    readEnabledComponentsLPw(packageSetting, parser, 0);
2167cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("sigs")) {
2168cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.signatures.readXml(parser, mPastSignatures);
2169cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
2170447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, packageSetting.grantedPermissions);
2171cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    packageSetting.permissionsFixed = true;
2172cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2173cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2174cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <package>: " + parser.getName());
2175cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
2176cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2177cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2178cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
2179cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2180cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2181cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2182cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2183483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readDisabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2184483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int userId) throws IOException, XmlPullParserException {
2185cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2186cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2187cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2188cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2189cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2190cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2191cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2192cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2193cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2194483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2195483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2196cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2197483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.addDisabledComponent(name.intern(), userId);
2198cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2199cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2200cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <disabled-components> has"
2201cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
2202cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2203cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2204cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2205cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <disabled-components>: " + parser.getName());
2206cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2207cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2208cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2209cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2210cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2211483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readEnabledComponentsLPw(PackageSettingBase packageSetting, XmlPullParser parser,
2212483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            int userId) throws IOException, XmlPullParserException {
2213cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2214cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2215cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2216cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2217cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2218cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2219cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2220cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2221cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2222483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2223483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2224cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2225483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    packageSetting.addEnabledComponent(name.intern(), userId);
2226cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2227cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2228cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <enabled-components> has"
2229cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + " no name at " + parser.getPositionDescription());
2230cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2231cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2232cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2233cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <enabled-components>: " + parser.getName());
2234cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2235cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2236cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2237cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2238cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2239483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private void readSharedUserLPw(XmlPullParser parser) throws XmlPullParserException,IOException {
2240cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String name = null;
2241cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        String idStr = null;
2242cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int pkgFlags = 0;
2243cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        SharedUserSetting su = null;
2244cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        try {
2245483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            name = parser.getAttributeValue(null, ATTR_NAME);
2246cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            idStr = parser.getAttributeValue(null, "userId");
2247cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int userId = idStr != null ? Integer.parseInt(idStr) : 0;
2248cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if ("true".equals(parser.getAttributeValue(null, "system"))) {
2249cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
2250cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2251cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (name == null) {
2252cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2253cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: <shared-user> has no name at "
2254cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2255cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else if (userId == 0) {
2256cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2257cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Error in package manager settings: shared-user " + name
2258cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + " has bad userId " + idStr + " at "
2259cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                + parser.getPositionDescription());
2260cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2261447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((su = addSharedUserLPw(name.intern(), userId, pkgFlags)) == null) {
2262cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService
2263cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            .reportSettingsProblem(Log.ERROR, "Occurred while parsing settings at "
2264cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2265cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2266cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2267cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } catch (NumberFormatException e) {
2268cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            PackageManagerService.reportSettingsProblem(Log.WARN,
2269cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    "Error in package manager settings: package " + name + " has bad userId "
2270cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            + idStr + " at " + parser.getPositionDescription());
2271cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2272cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        ;
2273cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2274cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (su != null) {
2275cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int outerDepth = parser.getDepth();
2276cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            int type;
2277cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2278cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2279cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2280cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    continue;
2281cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2282cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2283cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                String tagName = parser.getName();
2284cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (tagName.equals("sigs")) {
2285cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    su.signatures.readXml(parser, mPastSignatures);
2286cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else if (tagName.equals("perms")) {
2287447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    readGrantedPermissionsLPw(parser, su.grantedPermissions);
2288cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2289cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2290cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Unknown element under <shared-user>: " + parser.getName());
2291cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    XmlUtils.skipCurrentTag(parser);
2292cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2293cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2294cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2295cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        } else {
2296cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2297cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2298cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2299cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2300447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private void readGrantedPermissionsLPw(XmlPullParser parser, HashSet<String> outPerms)
2301cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            throws IOException, XmlPullParserException {
2302cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int outerDepth = parser.getDepth();
2303cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        int type;
2304cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
2305cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2306cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2307cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                continue;
2308cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2309cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2310cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            String tagName = parser.getName();
2311483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (tagName.equals(TAG_ITEM)) {
2312483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                String name = parser.getAttributeValue(null, ATTR_NAME);
2313cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                if (name != null) {
2314cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    outPerms.add(name.intern());
2315cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                } else {
2316cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                    PackageManagerService.reportSettingsProblem(Log.WARN,
2317cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                            "Error in package manager settings: <perms> has" + " no name at "
2318cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                                    + parser.getPositionDescription());
2319cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                }
2320cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            } else {
2321cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                PackageManagerService.reportSettingsProblem(Log.WARN,
2322cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                        "Unknown element under <perms>: " + parser.getName());
2323cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2324cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            XmlUtils.skipCurrentTag(parser);
2325cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2326cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2327cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
23286309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn    void createNewUserLILPw(Installer installer, int userHandle, File path) {
23296309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        path.mkdir();
23306309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG
23316309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                | FileUtils.S_IXOTH, -1, -1);
23326309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        for (PackageSetting ps : mPackages.values()) {
23336309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            // Only system apps are initially installed.
23346309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
23356309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            // Need to create a data directory for all apps under this user.
23366309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            installer.createUserData(ps.name,
23376309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn                    UserHandle.getUid(userHandle, ps.appId), userHandle);
23386309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        }
23396309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        readDefaultPreferredAppsLPw(userHandle);
23406309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        writePackageRestrictionsLPr(userHandle);
2341cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2342cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2343135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    void removeUserLPr(int userId) {
23446309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        Set<Entry<String, PackageSetting>> entries = mPackages.entrySet();
23456309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        for (Entry<String, PackageSetting> entry : entries) {
23466309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn            entry.getValue().removeUser(userId);
23476309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        }
23486309271f7b0f27ee725e36bfa48b4d250e44006fDianne Hackborn        mPreferredActivities.remove(userId);
2349135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        File file = getUserPackagesStateFile(userId);
2350135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file.delete();
2351135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file = getUserPackagesStateBackupFile(userId);
2352135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        file.delete();
2353135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    }
2354135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani
2355cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    // Returns -1 if we could not find an available UserId to assign
2356447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    private int newUserIdLPw(Object obj) {
2357cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // Let's be stupidly inefficient for now...
2358cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        final int N = mUserIds.size();
2359cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        for (int i = 0; i < N; i++) {
2360cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            if (mUserIds.get(i) == null) {
2361cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                mUserIds.set(i, obj);
236221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn                return Process.FIRST_APPLICATION_UID + i;
2363cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            }
2364cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2365cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2366cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        // None left?
236721fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {
2368cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return -1;
2369cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2370cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2371cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        mUserIds.add(obj);
237221fbd1f7da53dc044737803dccddf8099f1fc1e9Dianne Hackborn        return Process.FIRST_APPLICATION_UID + N;
2373cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2374cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
23750aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    public VerifierDeviceIdentity getVerifierDeviceIdentityLPw() {
23760aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        if (mVerifierDeviceIdentity == null) {
23770aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            mVerifierDeviceIdentity = VerifierDeviceIdentity.generate();
23780aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
23790aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root            writeLPr();
23800aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        }
23810aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
23820aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root        return mVerifierDeviceIdentity;
23830aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root    }
23840aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root
2385447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    public PackageSetting getDisabledSystemPkgLPr(String name) {
2386447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        PackageSetting ps = mDisabledSysPackages.get(name);
2387447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return ps;
2388cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2389cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
23907767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    private String compToString(HashSet<String> cmp) {
23917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        return cmp != null ? Arrays.toString(cmp.toArray()) : "[]";
23927767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn    }
23937767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn
2394483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    boolean isEnabledLPr(ComponentInfo componentInfo, int flags, int userId) {
2395cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) {
2396cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
2397cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2398483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        final String pkgName = componentInfo.packageName;
2399483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        final PackageSetting packageSettings = mPackages.get(pkgName);
2400cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (PackageManagerService.DEBUG_SETTINGS) {
2401483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Log.v(PackageManagerService.TAG, "isEnabledLock - packageName = "
2402483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    + componentInfo.packageName + " componentName = " + componentInfo.name);
2403cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "enabledComponents: "
24047767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    + compToString(packageSettings.getEnabledComponents(userId)));
2405cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            Log.v(PackageManagerService.TAG, "disabledComponents: "
24067767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    + compToString(packageSettings.getDisabledComponents(userId)));
2407cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2408cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        if (packageSettings == null) {
2409cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2410cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
24117767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        PackageUserState ustate = packageSettings.readUserState(userId);
24127767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED
24137767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                || ustate.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
2414cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                || (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
24157767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    && ustate.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
2416cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2417cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
24187767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (ustate.enabledComponents != null
24197767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                && ustate.enabledComponents.contains(componentInfo.name)) {
2420cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return true;
2421cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
24227767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn        if (ustate.disabledComponents != null
24237767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                && ustate.disabledComponents.contains(componentInfo.name)) {
2424cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            return false;
2425cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        }
2426cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return componentInfo.enabled;
2427cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
2428447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2429447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    String getInstallerPackageNameLPr(String packageName) {
2430447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2431447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2432447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2433447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2434447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return pkg.installerPackageName;
2435447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2436447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2437483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getApplicationEnabledSettingLPr(String packageName, int userId) {
2438447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2439447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2440447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2441447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2442483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return pkg.getEnabled(userId);
2443447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2444447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2445483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    int getComponentEnabledSettingLPr(ComponentName componentName, int userId) {
2446447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String packageName = componentName.getPackageName();
2447447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkg = mPackages.get(packageName);
2448447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkg == null) {
2449447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown component: " + componentName);
2450447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2451447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final String classNameStr = componentName.getClassName();
2452483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return pkg.getCurrentEnabledStateLPr(classNameStr, userId);
2453447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2454483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2455447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    boolean setPackageStoppedStateLPw(String packageName, boolean stopped,
2456483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            boolean allowedByPermission, int uid, int userId) {
2457f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        int appId = UserHandle.getAppId(uid);
2458447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final PackageSetting pkgSetting = mPackages.get(packageName);
2459447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (pkgSetting == null) {
2460447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new IllegalArgumentException("Unknown package: " + packageName);
2461447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2462135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani        if (!allowedByPermission && (appId != pkgSetting.appId)) {
2463447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            throw new SecurityException(
2464447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    "Permission Denial: attempt to change stopped state from pid="
2465447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    + Binder.getCallingPid()
2466135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                    + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
2467447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2468447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (DEBUG_STOPPED) {
2469447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (stopped) {
2470447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                RuntimeException e = new RuntimeException("here");
2471447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                e.fillInStackTrace();
2472447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                Slog.i(TAG, "Stopping package " + packageName, e);
2473447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2474447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2475483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (pkgSetting.getStopped(userId) != stopped) {
2476483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            pkgSetting.setStopped(stopped, userId);
2477483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // pkgSetting.pkg.mSetStopped = stopped;
2478483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (pkgSetting.getNotLaunched(userId)) {
2479447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (pkgSetting.installerPackageName != null) {
2480447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    PackageManagerService.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH,
2481447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                            pkgSetting.name, null,
24827767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                            pkgSetting.installerPackageName, null, new int[] {userId});
2483447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2484483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pkgSetting.setNotLaunched(false, userId);
2485447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2486447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            return true;
2487447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2488447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        return false;
2489447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2490447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2491483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    private List<UserInfo> getAllUsers() {
24927ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        long id = Binder.clearCallingIdentity();
2493483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        try {
2494920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani            return UserManagerService.getInstance().getUsers(false);
2495483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (NullPointerException npe) {
2496483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            // packagemanager not yet initialized
24977ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        } finally {
24987ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani            Binder.restoreCallingIdentity(id);
2499483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
2500483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return null;
2501483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
2502483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
250320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    static final void printFlags(PrintWriter pw, int val, Object[] spec) {
250420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        pw.print("[ ");
250520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        for (int i=0; i<spec.length; i+=2) {
250620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            int mask = (Integer)spec[i];
250720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            if ((val & mask) != 0) {
250820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print(spec[i+1]);
250920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print(" ");
251020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato            }
251120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        }
251220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        pw.print("]");
251320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    }
251420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato
251520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    static final Object[] FLAG_DUMP_SPEC = new Object[] {
251620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_SYSTEM, "SYSTEM",
251720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE",
251820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE",
251920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT",
252020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST",
252120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING",
252220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA",
252320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP",
252420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY",
252520963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE",
252620963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP",
252720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE",
252820963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION",
252920963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE",
253020963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP",
253120963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK",
253220963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato        ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE",
253320963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato    };
253420963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato
2535447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPackagesLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2536447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2537447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        final Date date = new Date();
2538447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
25397ea3e7df1f1ff5dde8ffb42fa179beef679f40eaAmith Yamasani        List<UserInfo> users = getAllUsers();
2540447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (final PackageSetting ps : mPackages.values()) {
2541447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(ps.realName)
2542447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    && !packageName.equals(ps.name)) {
2543447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2544447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2545447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2546447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null) {
2547447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                dumpState.setSharedUser(ps.sharedUser);
2548447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2549447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2550447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2551447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2552447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2553447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Packages:");
2554447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2555447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2556447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Package [");
2557447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2558447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2559447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2560447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2561447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2562447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.realName != null) {
2563447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    compat name=");
2564447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.name);
2565447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2566447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2567135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            pw.print("    userId="); pw.print(ps.appId);
2568447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids="); pw.println(PackageManagerService.arrayToString(ps.gids));
2569447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sharedUser="); pw.println(ps.sharedUser);
2570447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    pkg="); pw.println(ps.pkg);
2571447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    codePath="); pw.println(ps.codePathString);
2572447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    resourcePath="); pw.println(ps.resourcePathString);
2573447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    nativeLibraryPath="); pw.println(ps.nativeLibraryPathString);
2574447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    versionCode="); pw.println(ps.versionCode);
2575447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.pkg != null) {
2576eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                pw.print("    applicationInfo="); pw.println(ps.pkg.applicationInfo.toString());
257720963df86f3f27f4c54c1ddf177c57d58f0a9128Joe Onorato                pw.print("    flags="); printFlags(pw, ps.pkg.applicationInfo.flags, FLAG_DUMP_SPEC); pw.println();
2578447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    versionName="); pw.println(ps.pkg.mVersionName);
2579447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
2580447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
2581447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.pkg.mOperationPending) {
2582447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("    mOperationPending=true");
2583447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2584447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    supportsScreens=[");
2585447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                boolean first = true;
2586447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
2587447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2588447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2589447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2590447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("small");
2591447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2592447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
2593447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2594447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2595447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2596447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("medium");
2597447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2598447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
2599447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2600447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2601447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2602447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("large");
2603447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2604447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) {
2605447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2606447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2607447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2608447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("xlarge");
2609447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2610447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
2611447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2612447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2613447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2614447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("resizeable");
2615447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2616447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if ((ps.pkg.applicationInfo.flags & ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
2617447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (!first)
2618447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.print(", ");
2619447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    first = false;
2620447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("anyDensity");
2621447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
26225e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                pw.println("]");
2623447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2624447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    timeStamp=");
2625447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.timeStamp);
2626447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2627447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    firstInstallTime=");
2628447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.firstInstallTime);
2629447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2630447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    lastUpdateTime=");
2631447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                date.setTime(ps.lastUpdateTime);
2632447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(sdf.format(date));
2633447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.installerPackageName != null) {
2634447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    installerPackageName="); pw.println(ps.installerPackageName);
2635447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2636447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    signatures="); pw.println(ps.signatures);
2637d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn            pw.print("    permissionsFixed="); pw.print(ps.permissionsFixed);
2638d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn                    pw.print(" haveGids="); pw.print(ps.haveGids);
2639d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn                    pw.print(" installStatus="); pw.println(ps.installStatus);
26405455f6826f832ed0f07d28a772f4489d7223acb3Kenny Root            pw.print("    pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
2641d4ac8d7b3de27a9f0e4c6af2496ca71d794e42d1Dianne Hackborn                    pw.println();
2642483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            for (UserInfo user : users) {
26437767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                pw.print("    User "); pw.print(user.id); pw.print(": ");
26447767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                pw.print(" installed=");
26457767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                pw.print(ps.getInstalled(user.id));
2646483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(" stopped=");
2647483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(ps.getStopped(user.id));
26487767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                pw.print(" notLaunched=");
26497767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                pw.print(ps.getNotLaunched(user.id));
2650483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.print(" enabled=");
2651483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                pw.println(ps.getEnabled(user.id));
26527767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                HashSet<String> cmp = ps.getDisabledComponents(user.id);
26537767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                if (cmp != null && cmp.size() > 0) {
26547767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    pw.println("      disabledComponents:");
26557767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    for (String s : cmp) {
2656483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pw.print("      "); pw.println(s);
2657483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
2658447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
26597767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                cmp = ps.getEnabledComponents(user.id);
26607767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                if (cmp != null && cmp.size() > 0) {
26617767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    pw.println("      enabledComponents:");
26627767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                    for (String s : cmp) {
2663483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        pw.print("      "); pw.println(s);
2664483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                    }
2665447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2666447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2667447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (ps.grantedPermissions.size() > 0) {
2668447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("    grantedPermissions:");
2669447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                for (String s : ps.grantedPermissions) {
2670447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("      "); pw.println(s);
2671447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2672447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2673447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2674447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2675447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2676447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mRenamedPackages.size() > 0) {
26772f36229db823d152f3efd879e751e81a601a75b0Andy McFadden            for (final Map.Entry<String, String> e : mRenamedPackages.entrySet()) {
2678447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(e.getKey())
2679447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(e.getValue())) {
2680447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2681447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2682447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2683447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2684447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2685447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Renamed packages:");
2686447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2687447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2688447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  ");
2689447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(e.getKey());
2690447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(" -> ");
2691447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(e.getValue());
2692447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2693447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2694447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2695447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        printedSomething = false;
2696447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        if (mDisabledSysPackages.size() > 0) {
2697447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (final PackageSetting ps : mDisabledSysPackages.values()) {
2698447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (packageName != null && !packageName.equals(ps.realName)
2699447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        && !packageName.equals(ps.name)) {
2700447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    continue;
2701447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2702447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (!printedSomething) {
2703447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    if (dumpState.onTitlePrinted())
2704447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                        pw.println(" ");
2705447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("Hidden system packages:");
2706447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    printedSomething = true;
2707447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2708447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("  Package [");
2709447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(ps.realName != null ? ps.realName : ps.name);
2710447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("] (");
2711447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print(Integer.toHexString(System.identityHashCode(ps)));
2712447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("):");
2713447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (ps.realName != null) {
2714447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print("    compat name=");
2715447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(ps.name);
2716447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                }
2717eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                if (ps.pkg != null && ps.pkg.applicationInfo != null) {
2718eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                    pw.print("    applicationInfo=");
2719eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                    pw.println(ps.pkg.applicationInfo.toString());
2720eca64b391408dfdb9ff3ae03fc39cfdb6918f3adKenny Root                }
2721447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    userId=");
2722135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani                pw.println(ps.appId);
2723447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    sharedUser=");
2724447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.sharedUser);
2725447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    codePath=");
2726447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.codePathString);
2727447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    resourcePath=");
2728447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(ps.resourcePathString);
2729447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2730447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2731447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2732483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
2733447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpPermissionsLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2734447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2735447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (BasePermission p : mPermissions.values()) {
2736447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && !packageName.equals(p.sourcePackage)) {
2737447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2738447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2739447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2740447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2741447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2742447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Permissions:");
2743447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2744447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2745447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  Permission ["); pw.print(p.name); pw.print("] (");
2746447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(Integer.toHexString(System.identityHashCode(p)));
2747447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2748447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    sourcePackage="); pw.println(p.sourcePackage);
2749447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    uid="); pw.print(p.uid);
2750447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" gids="); pw.print(PackageManagerService.arrayToString(p.gids));
2751447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.print(" type="); pw.print(p.type);
2752e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    pw.print(" prot=");
2753e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                    pw.println(PermissionInfo.protectionToString(p.protectionLevel));
2754447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.packageSetting != null) {
2755447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    packageSetting="); pw.println(p.packageSetting);
2756447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2757447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (p.perm != null) {
2758447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("    perm="); pw.println(p.perm);
2759447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
27601c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey            if (READ_EXTERNAL_STORAGE.equals(p.name)) {
27615d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                pw.print("    enforced=");
27625d32e772b3a19c1ac84e665f2885755427d590c8Jeff Sharkey                pw.println(mReadExternalStorageEnforced);
27631c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey            }
2764447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2765447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
27661c27576aff247ff1d7789e0a571958726f161593Jeff Sharkey
2767447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
2768447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        boolean printedSomething = false;
2769447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        for (SharedUserSetting su : mSharedUsers.values()) {
2770447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (packageName != null && su != dumpState.getSharedUser()) {
2771447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                continue;
2772447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2773447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            if (!printedSomething) {
2774447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                if (dumpState.onTitlePrinted())
2775447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println(" ");
2776447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println("Shared users:");
2777447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                printedSomething = true;
2778447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2779447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("  SharedUser [");
2780447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.name);
2781447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("] (");
2782447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(Integer.toHexString(System.identityHashCode(su)));
2783447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                    pw.println("):");
2784447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print("    userId=");
2785447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(su.userId);
2786447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.print(" gids=");
2787447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println(PackageManagerService.arrayToString(su.gids));
2788447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            pw.println("    grantedPermissions:");
2789447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            for (String s : su.grantedPermissions) {
2790447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.print("      ");
2791447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root                pw.println(s);
2792447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root            }
2793447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        }
2794447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
2795447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root
2796447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    void dumpReadMessagesLPr(PrintWriter pw, DumpState dumpState) {
2797447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.println("Settings parse messages:");
2798447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root        pw.print(mReadMessages.toString());
2799447106fc839520d18dcb367ba17fc8ec345bb9e8Kenny Root    }
28002f36229db823d152f3efd879e751e81a601a75b0Andy McFadden}
2801