diff options
author | Amith Yamasani <yamasani@google.com> | 2012-10-21 07:44:45 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-10-21 07:44:46 -0700 |
commit | 8074e98b20ac04fdc032a1ed00dd6763b7e04147 (patch) | |
tree | bc6f29dced9a3eed7d2cd26b6220034dd9592b17 /services/java/com/android | |
parent | 7707b050f7f0f01819aaa6ccdafe0721c267fdeb (diff) | |
parent | db6a14cc85cede0769735fdac4da70766989a3ce (diff) | |
download | frameworks_base-8074e98b20ac04fdc032a1ed00dd6763b7e04147.zip frameworks_base-8074e98b20ac04fdc032a1ed00dd6763b7e04147.tar.gz frameworks_base-8074e98b20ac04fdc032a1ed00dd6763b7e04147.tar.bz2 |
Merge "Fix crashes when quickly adding and removing users" into jb-mr1-dev
Diffstat (limited to 'services/java/com/android')
-rw-r--r-- | services/java/com/android/server/pm/PackageManagerService.java | 8 | ||||
-rw-r--r-- | services/java/com/android/server/pm/UserManagerService.java | 39 |
2 files changed, 33 insertions, 14 deletions
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 977437b..4c6f589 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -2575,7 +2575,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags, int userId) { - if (!sUserManager.exists(userId)) return null; + if (!sUserManager.exists(userId)) return Collections.emptyList(); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activities"); ComponentName comp = intent.getComponent(); if (comp == null) { @@ -2615,7 +2615,7 @@ public class PackageManagerService extends IPackageManager.Stub { public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent, String resolvedType, int flags, int userId) { - if (!sUserManager.exists(userId)) return null; + if (!sUserManager.exists(userId)) return Collections.emptyList(); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activity options"); final String resultsAction = intent.getAction(); @@ -2787,7 +2787,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, int userId) { - if (!sUserManager.exists(userId)) return null; + if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { @@ -2838,7 +2838,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, int userId) { - if (!sUserManager.exists(userId)) return null; + if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java index 072dd33..fb93d05 100644 --- a/services/java/com/android/server/pm/UserManagerService.java +++ b/services/java/com/android/server/pm/UserManagerService.java @@ -19,9 +19,11 @@ package com.android.server.pm; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; +import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.IStopUserCallback; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -736,21 +738,38 @@ public class UserManagerService extends IUserManager.Stub { return res == ActivityManager.USER_OP_SUCCESS; } - void finishRemoveUser(int userHandle) { + void finishRemoveUser(final int userHandle) { if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle); - synchronized (mInstallLock) { - synchronized (mPackagesLock) { - removeUserStateLocked(userHandle); - } - } - if (DBG) Slog.i(LOG_TAG, "Removed user " + userHandle + ", sending broadcast"); - // Let other services shutdown any activity + // Let other services shutdown any activity and clean up their state before completely + // wiping the user's system directory and removing from the user list long ident = Binder.clearCallingIdentity(); try { Intent addedIntent = new Intent(Intent.ACTION_USER_REMOVED); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); - mContext.sendBroadcastAsUser(addedIntent, UserHandle.ALL, - android.Manifest.permission.MANAGE_USERS); + mContext.sendOrderedBroadcastAsUser(addedIntent, UserHandle.ALL, + android.Manifest.permission.MANAGE_USERS, + + new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (DBG) { + Slog.i(LOG_TAG, + "USER_REMOVED broadcast sent, cleaning up user data " + + userHandle); + } + new Thread() { + public void run() { + synchronized (mInstallLock) { + synchronized (mPackagesLock) { + removeUserStateLocked(userHandle); + } + } + } + }.start(); + } + }, + + null, Activity.RESULT_OK, null, null); } finally { Binder.restoreCallingIdentity(ident); } |