diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-10-07 14:45:35 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2012-10-07 14:45:35 -0700 |
commit | 6309271f7b0f27ee725e36bfa48b4d250e44006f (patch) | |
tree | 7e26484db78bb1e261b64ab3a16065dd4b512454 /services | |
parent | 1ad0fd9c04ae2e352c59129b979145e662f25cbc (diff) | |
download | frameworks_base-6309271f7b0f27ee725e36bfa48b4d250e44006f.zip frameworks_base-6309271f7b0f27ee725e36bfa48b4d250e44006f.tar.gz frameworks_base-6309271f7b0f27ee725e36bfa48b4d250e44006f.tar.bz2 |
Fix issue #7295951: Mako asks which Launcher to use at every re-boot
A couple problems:
- We need to clear app preferences later, now that we have encrypted apps.
- The multi-user implementation of this would allow different preferred
apps from different users to potentially interefere with each other.
They are not completely separate data structures.
Change-Id: Id4f1ebb6414fdf30ff1049adaa1efe83dabac01a
Diffstat (limited to 'services')
4 files changed, 230 insertions, 173 deletions
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 0f3dc92..0600f5c 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -1300,27 +1300,6 @@ public class PackageManagerService extends IPackageManager.Stub { ? (UPDATE_PERMISSIONS_REPLACE_PKG|UPDATE_PERMISSIONS_REPLACE_ALL) : 0)); - // Verify that all of the preferred activity components actually - // exist. It is possible for applications to be updated and at - // that point remove a previously declared activity component that - // had been set as a preferred activity. We try to clean this up - // the next time we encounter that preferred activity, but it is - // possible for the user flow to never be able to return to that - // situation so here we do a sanity check to make sure we haven't - // left any junk around. - ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); - for (PreferredActivity pa : mSettings.mPreferredActivities.filterSet()) { - if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { - removed.add(pa); - } - } - for (int i=0; i<removed.size(); i++) { - PreferredActivity pa = removed.get(i); - Slog.w(TAG, "Removing dangling preferred activity: " - + pa.mPref.mComponent); - mSettings.mPreferredActivities.removeFilter(pa); - } - // can downgrade to reader mSettings.writeLPr(); @@ -2504,9 +2483,11 @@ public class PackageManagerService extends IPackageManager.Stub { intent = intent.getSelector(); } if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); - List<PreferredActivity> prefs = - mSettings.mPreferredActivities.queryIntent(intent, resolvedType, - (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId); + PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); + List<PreferredActivity> prefs = pir != null + ? pir.queryIntent(intent, resolvedType, + (flags & PackageManager.MATCH_DEFAULT_ONLY) != 0, userId) + : null; if (prefs != null && prefs.size() > 0) { // First figure out how good the original match set is. // We will only allow preferred activities that came @@ -2537,9 +2518,6 @@ public class PackageManagerService extends IPackageManager.Stub { final int M = prefs.size(); for (int i=0; i<M; i++) { final PreferredActivity pa = prefs.get(i); - if (pa.mUserId != userId) { - continue; - } if (pa.mPref.mMatch != match) { continue; } @@ -2560,7 +2538,7 @@ public class PackageManagerService extends IPackageManager.Stub { // it from the preferred activities list, and skip it. Slog.w(TAG, "Removing dangling preferred activity: " + pa.mPref.mComponent); - mSettings.mPreferredActivities.removeFilter(pa); + pir.removeFilter(pa); continue; } for (int j=0; j<N; j++) { @@ -2580,7 +2558,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!pa.mPref.sameSet(query, priority)) { Slog.i(TAG, "Result set changed, dropping preferred activity for " + intent + " type " + resolvedType); - mSettings.mPreferredActivities.removeFilter(pa); + pir.removeFilter(pa); return null; } @@ -8682,9 +8660,9 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.i(TAG, "Adding preferred activity " + activity + " for user " + userId + " :"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); - mSettings.mPreferredActivities.addFilter( - new PreferredActivity(filter, match, set, activity, userId)); - scheduleWriteSettingsLocked(); + mSettings.editPreferredActivitiesLPw(userId).addFilter( + new PreferredActivity(filter, match, set, activity)); + mSettings.writePackageRestrictionsLPr(userId); } } @@ -8722,25 +8700,27 @@ public class PackageManagerService extends IPackageManager.Stub { final int callingUserId = UserHandle.getCallingUserId(); ArrayList<PreferredActivity> removed = null; - Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); - String action = filter.getAction(0); - String category = filter.getCategory(0); - while (it.hasNext()) { - PreferredActivity pa = it.next(); - if (pa.mUserId != callingUserId) continue; - if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { - if (removed == null) { - removed = new ArrayList<PreferredActivity>(); + PreferredIntentResolver pir = mSettings.mPreferredActivities.get(callingUserId); + if (pir != null) { + Iterator<PreferredActivity> it = pir.filterIterator(); + String action = filter.getAction(0); + String category = filter.getCategory(0); + while (it.hasNext()) { + PreferredActivity pa = it.next(); + if (pa.getAction(0).equals(action) && pa.getCategory(0).equals(category)) { + if (removed == null) { + removed = new ArrayList<PreferredActivity>(); + } + removed.add(pa); + Log.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":"); + filter.dump(new LogPrinter(Log.INFO, TAG), " "); } - removed.add(pa); - Log.i(TAG, "Removing preferred activity " + pa.mPref.mComponent + ":"); - filter.dump(new LogPrinter(Log.INFO, TAG), " "); } - } - if (removed != null) { - for (int i=0; i<removed.size(); i++) { - PreferredActivity pa = removed.get(i); - mSettings.mPreferredActivities.removeFilter(pa); + if (removed != null) { + for (int i=0; i<removed.size(); i++) { + PreferredActivity pa = removed.get(i); + pir.removeFilter(pa); + } } } addPreferredActivity(filter, match, set, activity, callingUserId); @@ -8776,27 +8756,33 @@ public class PackageManagerService extends IPackageManager.Stub { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ boolean clearPackagePreferredActivitiesLPw(String packageName, int userId) { ArrayList<PreferredActivity> removed = null; - Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); - while (it.hasNext()) { - PreferredActivity pa = it.next(); - if (userId != UserHandle.USER_ALL && pa.mUserId != userId) { + boolean changed = false; + for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { + final int thisUserId = mSettings.mPreferredActivities.keyAt(i); + PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); + if (userId != UserHandle.USER_ALL && userId != thisUserId) { continue; } - if (pa.mPref.mComponent.getPackageName().equals(packageName)) { - if (removed == null) { - removed = new ArrayList<PreferredActivity>(); + Iterator<PreferredActivity> it = pir.filterIterator(); + while (it.hasNext()) { + PreferredActivity pa = it.next(); + if (pa.mPref.mComponent.getPackageName().equals(packageName)) { + if (removed == null) { + removed = new ArrayList<PreferredActivity>(); + } + removed.add(pa); } - removed.add(pa); } - } - if (removed != null) { - for (int i=0; i<removed.size(); i++) { - PreferredActivity pa = removed.get(i); - mSettings.mPreferredActivities.removeFilter(pa); + if (removed != null) { + for (int j=0; j<removed.size(); j++) { + PreferredActivity pa = removed.get(j); + pir.removeFilter(pa); + } + changed = true; + mSettings.writePackageRestrictionsLPr(thisUserId); } - return true; } - return false; + return changed; } public int getPreferredActivities(List<IntentFilter> outFilters, @@ -8806,19 +8792,19 @@ public class PackageManagerService extends IPackageManager.Stub { final int userId = UserHandle.getCallingUserId(); // reader synchronized (mPackages) { - final Iterator<PreferredActivity> it = mSettings.mPreferredActivities.filterIterator(); - while (it.hasNext()) { - final PreferredActivity pa = it.next(); - if (pa.mUserId != userId) { - continue; - } - if (packageName == null - || pa.mPref.mComponent.getPackageName().equals(packageName)) { - if (outFilters != null) { - outFilters.add(new IntentFilter(pa)); - } - if (outActivities != null) { - outActivities.add(pa.mPref.mComponent); + PreferredIntentResolver pir = mSettings.mPreferredActivities.get(userId); + if (pir != null) { + final Iterator<PreferredActivity> it = pir.filterIterator(); + while (it.hasNext()) { + final PreferredActivity pa = it.next(); + if (packageName == null + || pa.mPref.mComponent.getPackageName().equals(packageName)) { + if (outFilters != null) { + outFilters.add(new IntentFilter(pa)); + } + if (outActivities != null) { + outActivities.add(pa.mPref.mComponent); + } } } } @@ -9041,6 +9027,39 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_SETTINGS) { Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled); } + + synchronized (mPackages) { + // Verify that all of the preferred activity components actually + // exist. It is possible for applications to be updated and at + // that point remove a previously declared activity component that + // had been set as a preferred activity. We try to clean this up + // the next time we encounter that preferred activity, but it is + // possible for the user flow to never be able to return to that + // situation so here we do a sanity check to make sure we haven't + // left any junk around. + ArrayList<PreferredActivity> removed = new ArrayList<PreferredActivity>(); + for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { + PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); + removed.clear(); + for (PreferredActivity pa : pir.filterSet()) { + if (mActivities.mActivities.get(pa.mPref.mComponent) == null) { + removed.add(pa); + } + } + if (removed.size() > 0) { + for (int j=0; j<removed.size(); j++) { + PreferredActivity pa = removed.get(i); + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Slog.w(TAG, "Removing dangling preferred activity: " + + pa.mPref.mComponent, here); + pir.removeFilter(pa); + } + mSettings.writePackageRestrictionsLPr( + mSettings.mPreferredActivities.keyAt(i)); + } + } + } } public boolean isSafeMode() { @@ -9281,11 +9300,16 @@ public class PackageManagerService extends IPackageManager.Stub { } if (dumpState.isDumping(DumpState.DUMP_PREFERRED)) { - if (mSettings.mPreferredActivities.dump(pw, - dumpState.getTitlePrinted() ? "\nPreferred Activities:" - : "Preferred Activities:", " ", - packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { - dumpState.setTitlePrinted(true); + for (int i=0; i<mSettings.mPreferredActivities.size(); i++) { + PreferredIntentResolver pir = mSettings.mPreferredActivities.valueAt(i); + int user = mSettings.mPreferredActivities.keyAt(i); + if (pir.dump(pw, + dumpState.getTitlePrinted() + ? "\nPreferred Activities User " + user + ":" + : "Preferred Activities User " + user + ":", " ", + packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) { + dumpState.setTitlePrinted(true); + } } } @@ -9299,7 +9323,7 @@ public class PackageManagerService extends IPackageManager.Stub { serializer.startDocument(null, true); serializer.setFeature( "http://xmlpull.org/v1/doc/features.html#indent-output", true); - mSettings.writePreferredActivitiesLPr(serializer); + mSettings.writePreferredActivitiesLPr(serializer, 0); serializer.endDocument(); serializer.flush(); } catch (IllegalArgumentException e) { @@ -10045,11 +10069,6 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ void cleanUpUserLILPw(int userHandle) { - // Disable all the packages for the user first - Set<Entry<String, PackageSetting>> entries = mSettings.mPackages.entrySet(); - for (Entry<String, PackageSetting> entry : entries) { - entry.getValue().removeUser(userHandle); - } if (mDirtyUsers.remove(userHandle)); mSettings.removeUserLPr(userHandle); if (mInstaller != null) { @@ -10063,17 +10082,7 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ void createNewUserLILPw(int userHandle, File path) { if (mInstaller != null) { - path.mkdir(); - FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG - | FileUtils.S_IXOTH, -1, -1); - for (PackageSetting ps : mSettings.mPackages.values()) { - // Only system apps are initially installed. - ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); - // Need to create a data directory for all apps under this user. - mInstaller.createUserData(ps.name, - UserHandle.getUid(userHandle, ps.appId), userHandle); - } - mSettings.writePackageRestrictionsLPr(userHandle); + mSettings.createNewUserLILPw(mInstaller, userHandle, path); } } diff --git a/services/java/com/android/server/pm/PreferredActivity.java b/services/java/com/android/server/pm/PreferredActivity.java index 5539e84..dbf56ef 100644 --- a/services/java/com/android/server/pm/PreferredActivity.java +++ b/services/java/com/android/server/pm/PreferredActivity.java @@ -36,32 +36,17 @@ class PreferredActivity extends IntentFilter implements PreferredComponent.Callb static final String ATTR_USER_ID = "userId"; final PreferredComponent mPref; - final int mUserId; PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { - this(filter, match, set, activity, 0); - } - - PreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, - int userId) { super(filter); - mUserId = userId; mPref = new PreferredComponent(this, match, set, activity); } PreferredActivity(XmlPullParser parser) throws XmlPullParserException, IOException { - String userIdString = parser.getAttributeValue(null, ATTR_USER_ID); - if (userIdString != null && userIdString.length() > 0) { - mUserId = Integer.parseInt(userIdString); - } else { - // Old format with no userId specified - assume primary user - mUserId = 0; - } mPref = new PreferredComponent(this, parser); } public void writeToXml(XmlSerializer serializer) throws IOException { - serializer.attribute(null, ATTR_USER_ID, Integer.toString(mUserId)); mPref.writeToXml(serializer); serializer.startTag(null, "filter"); super.writeToXml(serializer); diff --git a/services/java/com/android/server/pm/PreferredIntentResolver.java b/services/java/com/android/server/pm/PreferredIntentResolver.java new file mode 100644 index 0000000..3f1e50c --- /dev/null +++ b/services/java/com/android/server/pm/PreferredIntentResolver.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import java.io.PrintWriter; + +import com.android.server.IntentResolver; + +public class PreferredIntentResolver + extends IntentResolver<PreferredActivity, PreferredActivity> { + @Override + protected PreferredActivity[] newArray(int size) { + return new PreferredActivity[size]; + } + @Override + protected String packageForFilter(PreferredActivity filter) { + return filter.mPref.mComponent.getPackageName(); + } + @Override + protected void dumpFilter(PrintWriter out, String prefix, + PreferredActivity filter) { + filter.mPref.dump(out, prefix, filter); + } +} diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index bdf5044..3a54514 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -70,6 +70,8 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; import libcore.io.IoUtils; @@ -123,22 +125,9 @@ final class Settings { // The user's preferred activities associated with particular intent // filters. - final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities = - new IntentResolver<PreferredActivity, PreferredActivity>() { - @Override - protected PreferredActivity[] newArray(int size) { - return new PreferredActivity[size]; - } - @Override - protected String packageForFilter(PreferredActivity filter) { - return filter.mPref.mComponent.getPackageName(); - } - @Override - protected void dumpFilter(PrintWriter out, String prefix, - PreferredActivity filter) { - filter.mPref.dump(out, prefix, filter); - } - }; + final SparseArray<PreferredIntentResolver> mPreferredActivities = + new SparseArray<PreferredIntentResolver>(); + final HashMap<String, SharedUserSetting> mSharedUsers = new HashMap<String, SharedUserSetting>(); private final ArrayList<Object> mUserIds = new ArrayList<Object>(); @@ -745,6 +734,15 @@ final class Settings { } } + PreferredIntentResolver editPreferredActivitiesLPw(int userId) { + PreferredIntentResolver pir = mPreferredActivities.get(userId); + if (pir == null) { + pir = new PreferredIntentResolver(); + mPreferredActivities.put(userId, pir); + } + return pir; + } + private File getUserPackagesStateFile(int userId) { return new File(Environment.getUserSystemDirectory(userId), "package-restrictions.xml"); } @@ -775,6 +773,35 @@ final class Settings { } } + private void readPreferredActivitiesLPw(XmlPullParser parser, int userId) + throws XmlPullParserException, IOException { + int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + + String tagName = parser.getName(); + if (tagName.equals(TAG_ITEM)) { + PreferredActivity pa = new PreferredActivity(parser); + if (pa.mPref.getParseError() == null) { + editPreferredActivitiesLPw(userId).addFilter(pa); + } else { + PackageManagerService.reportSettingsProblem(Log.WARN, + "Error in package manager settings: <preferred-activity> " + + pa.mPref.getParseError() + " at " + + parser.getPositionDescription()); + } + } else { + PackageManagerService.reportSettingsProblem(Log.WARN, + "Unknown element under <preferred-activities>: " + parser.getName()); + XmlUtils.skipCurrentTag(parser); + } + } + } + void readPackageRestrictionsLPr(int userId) { if (DEBUG_MU) { Log.i(TAG, "Reading package restrictions for user=" + userId); @@ -893,6 +920,8 @@ final class Settings { ps.setUserState(userId, enabled, installed, stopped, notLaunched, enabledComponents, disabledComponents); + } else if (tagName.equals("preferred-activities")) { + readPreferredActivitiesLPw(parser, userId); } else { Slog.w(PackageManagerService.TAG, "Unknown element under <stopped-packages>: " + parser.getName()); @@ -942,6 +971,20 @@ final class Settings { return components; } + void writePreferredActivitiesLPr(XmlSerializer serializer, int userId) + throws IllegalArgumentException, IllegalStateException, IOException { + serializer.startTag(null, "preferred-activities"); + PreferredIntentResolver pir = mPreferredActivities.get(userId); + if (pir != null) { + for (final PreferredActivity pa : pir.filterSet()) { + serializer.startTag(null, TAG_ITEM); + pa.writeToXml(serializer); + serializer.endTag(null, TAG_ITEM); + } + } + serializer.endTag(null, "preferred-activities"); + } + void writePackageRestrictionsLPr(int userId) { if (DEBUG_MU) { Log.i(TAG, "Writing package restrictions for user=" + userId); @@ -1028,6 +1071,8 @@ final class Settings { } } + writePreferredActivitiesLPr(serializer, userId); + serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS); serializer.endDocument(); @@ -1237,8 +1282,6 @@ final class Settings { writeDisabledSysPackageLPr(serializer, pkg); } - writePreferredActivitiesLPr(serializer); - for (final SharedUserSetting usr : mSharedUsers.values()) { serializer.startTag(null, "shared-user"); serializer.attribute(null, ATTR_NAME, usr.name); @@ -1366,17 +1409,6 @@ final class Settings { //Debug.stopMethodTracing(); } - void writePreferredActivitiesLPr(XmlSerializer serializer) - throws IllegalArgumentException, IllegalStateException, IOException { - serializer.startTag(null, "preferred-activities"); - for (final PreferredActivity pa : mPreferredActivities.filterSet()) { - serializer.startTag(null, TAG_ITEM); - pa.writeToXml(serializer); - serializer.endTag(null, TAG_ITEM); - } - serializer.endTag(null, "preferred-activities"); - } - void writeDisabledSysPackageLPr(XmlSerializer serializer, final PackageSetting pkg) throws java.io.IOException { serializer.startTag(null, "updated-package"); @@ -1554,7 +1586,7 @@ final class Settings { mReadMessages.append("No settings file found\n"); PackageManagerService.reportSettingsProblem(Log.INFO, "No settings file; creating initial state"); - readDefaultPreferredAppsLPw(); + readDefaultPreferredAppsLPw(0); return false; } str = new FileInputStream(mSettingsFilename); @@ -1596,7 +1628,9 @@ final class Settings { } else if (tagName.equals("preferred-packages")) { // no longer used. } else if (tagName.equals("preferred-activities")) { - readPreferredActivitiesLPw(parser); + // Upgrading from old single-user implementation; + // these are the preferred activities for user 0. + readPreferredActivitiesLPw(parser, 0); } else if (tagName.equals("updated-package")) { readDisabledSysPackageLPw(parser); } else if (tagName.equals("cleaning-package")) { @@ -1733,7 +1767,7 @@ final class Settings { return true; } - private void readDefaultPreferredAppsLPw() { + private void readDefaultPreferredAppsLPw(int userId) { // Read preferred apps from .../etc/preferred-apps directory. File preferredDir = new File(Environment.getRootDirectory(), "etc/preferred-apps"); if (!preferredDir.exists() || !preferredDir.isDirectory()) { @@ -1776,7 +1810,7 @@ final class Settings { + " does not start with 'preferred-activities'"); continue; } - readPreferredActivitiesLPw(parser); + readPreferredActivitiesLPw(parser, userId); } catch (XmlPullParserException e) { Slog.w(TAG, "Error reading apps file " + f, e); } catch (IOException e) { @@ -2291,36 +2325,27 @@ final class Settings { } } - private void readPreferredActivitiesLPw(XmlPullParser parser) throws XmlPullParserException, - IOException { - int outerDepth = parser.getDepth(); - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { - if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { - continue; - } - - String tagName = parser.getName(); - if (tagName.equals(TAG_ITEM)) { - PreferredActivity pa = new PreferredActivity(parser); - if (pa.mPref.getParseError() == null) { - mPreferredActivities.addFilter(pa); - } else { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Error in package manager settings: <preferred-activity> " - + pa.mPref.getParseError() + " at " - + parser.getPositionDescription()); - } - } else { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Unknown element under <preferred-activities>: " + parser.getName()); - XmlUtils.skipCurrentTag(parser); - } + void createNewUserLILPw(Installer installer, int userHandle, File path) { + path.mkdir(); + FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG + | FileUtils.S_IXOTH, -1, -1); + for (PackageSetting ps : mPackages.values()) { + // Only system apps are initially installed. + ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle); + // Need to create a data directory for all apps under this user. + installer.createUserData(ps.name, + UserHandle.getUid(userHandle, ps.appId), userHandle); } + readDefaultPreferredAppsLPw(userHandle); + writePackageRestrictionsLPr(userHandle); } void removeUserLPr(int userId) { + Set<Entry<String, PackageSetting>> entries = mPackages.entrySet(); + for (Entry<String, PackageSetting> entry : entries) { + entry.getValue().removeUser(userId); + } + mPreferredActivities.remove(userId); File file = getUserPackagesStateFile(userId); file.delete(); file = getUserPackagesStateBackupFile(userId); |