summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorAmith Yamasani <yamasani@google.com>2012-10-17 21:16:52 -0700
committerAmith Yamasani <yamasani@google.com>2012-10-19 16:23:30 -0700
commitdb6a14cc85cede0769735fdac4da70766989a3ce (patch)
tree746e34df3a9ae15f9e1934033f8d907173fbd725 /core/java
parentba0372db366e63fa928ba83f3ad8c064c51ac8e0 (diff)
downloadframeworks_base-db6a14cc85cede0769735fdac4da70766989a3ce.zip
frameworks_base-db6a14cc85cede0769735fdac4da70766989a3ce.tar.gz
frameworks_base-db6a14cc85cede0769735fdac4da70766989a3ce.tar.bz2
Fix crashes when quickly adding and removing users
Make USER_REMOVED an ordered broadcast and send it before the user's state is completely removed from the system. This gives services the opportunity to clean up their state, while still having access to the user's directory and UserInfo object (such as serial number). Tell SyncManager to skip over dying/partially created users. Improve UserManager tests, waiting for users to be removed fully. Bug: 7382252 Change-Id: I93cfb39c9efe6f15087bf83c569a2d154ef27168
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/content/Intent.java3
-rw-r--r--core/java/android/content/SyncManager.java4
2 files changed, 5 insertions, 2 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 97d299a..cf0603e 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2430,7 +2430,8 @@ public class Intent implements Parcelable, Cloneable {
/**
* Broadcast sent to the system when a user is removed. Carries an extra EXTRA_USER_HANDLE that has
* the userHandle of the user. It is sent to all running users except the
- * one that has been removed. You must hold
+ * one that has been removed. The user will not be completely removed until all receivers have
+ * handled the broadcast. You must hold
* {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast.
* @hide
*/
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index bb0c686..05bab9c 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -265,7 +265,9 @@ public class SyncManager {
}
private void doDatabaseCleanup() {
- for (UserInfo user : mUserManager.getUsers()) {
+ for (UserInfo user : mUserManager.getUsers(true)) {
+ // Skip any partially created/removed users
+ if (user.partial) continue;
Account[] accountsForUser = AccountManagerService.getSingleton().getAccounts(user.id);
mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id);
}