Loading core/java/android/content/Intent.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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 * 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 * 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. * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast. * @hide * @hide */ */ Loading core/java/android/content/SyncManager.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -265,7 +265,9 @@ public class SyncManager { } } private void doDatabaseCleanup() { 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); Account[] accountsForUser = AccountManagerService.getSingleton().getAccounts(user.id); mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id); mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id); } } Loading services/java/com/android/server/pm/PackageManagerService.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -2575,7 +2575,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentActivities(Intent intent, public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags, int userId) { 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"); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activities"); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { Loading Loading @@ -2615,7 +2615,7 @@ public class PackageManagerService extends IPackageManager.Stub { public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent, Intent[] specifics, String[] specificTypes, Intent intent, String resolvedType, int flags, int userId) { String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activity options"); "query intent activity options"); final String resultsAction = intent.getAction(); final String resultsAction = intent.getAction(); Loading Loading @@ -2787,7 +2787,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, int userId) { int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { if (intent.getSelector() != null) { if (intent.getSelector() != null) { Loading Loading @@ -2838,7 +2838,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, int userId) { int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { if (intent.getSelector() != null) { if (intent.getSelector() != null) { Loading services/java/com/android/server/pm/UserManagerService.java +29 −10 Original line number Original line Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.server.pm; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.FastXmlSerializer; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityManagerNative; import android.app.IStopUserCallback; import android.app.IStopUserCallback; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager; Loading Loading @@ -736,21 +738,38 @@ public class UserManagerService extends IUserManager.Stub { return res == ActivityManager.USER_OP_SUCCESS; return res == ActivityManager.USER_OP_SUCCESS; } } void finishRemoveUser(int userHandle) { void finishRemoveUser(final int userHandle) { if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle); if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle); // 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.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 (mInstallLock) { synchronized (mPackagesLock) { synchronized (mPackagesLock) { removeUserStateLocked(userHandle); removeUserStateLocked(userHandle); } } } } if (DBG) Slog.i(LOG_TAG, "Removed user " + userHandle + ", sending broadcast"); } // Let other services shutdown any activity }.start(); long ident = Binder.clearCallingIdentity(); } try { }, Intent addedIntent = new Intent(Intent.ACTION_USER_REMOVED); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); null, Activity.RESULT_OK, null, null); mContext.sendBroadcastAsUser(addedIntent, UserHandle.ALL, android.Manifest.permission.MANAGE_USERS); } finally { } finally { Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident); } } Loading services/tests/servicestests/AndroidManifest.xml +1 −1 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,7 @@ <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <application> <application> <uses-library android:name="android.test.runner" /> <uses-library android:name="android.test.runner" /> Loading Loading
core/java/android/content/Intent.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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 * 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 * 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. * {@link android.Manifest.permission#MANAGE_USERS} to receive this broadcast. * @hide * @hide */ */ Loading
core/java/android/content/SyncManager.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -265,7 +265,9 @@ public class SyncManager { } } private void doDatabaseCleanup() { 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); Account[] accountsForUser = AccountManagerService.getSingleton().getAccounts(user.id); mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id); mSyncStorageEngine.doDatabaseCleanup(accountsForUser, user.id); } } Loading
services/java/com/android/server/pm/PackageManagerService.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -2575,7 +2575,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentActivities(Intent intent, public List<ResolveInfo> queryIntentActivities(Intent intent, String resolvedType, int flags, int userId) { 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"); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activities"); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { Loading Loading @@ -2615,7 +2615,7 @@ public class PackageManagerService extends IPackageManager.Stub { public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent, Intent[] specifics, String[] specificTypes, Intent intent, String resolvedType, int flags, int userId) { String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); enforceCrossUserPermission(Binder.getCallingUid(), userId, false, enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "query intent activity options"); "query intent activity options"); final String resultsAction = intent.getAction(); final String resultsAction = intent.getAction(); Loading Loading @@ -2787,7 +2787,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, int userId) { int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { if (intent.getSelector() != null) { if (intent.getSelector() != null) { Loading Loading @@ -2838,7 +2838,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override @Override public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, public List<ResolveInfo> queryIntentServices(Intent intent, String resolvedType, int flags, int userId) { int userId) { if (!sUserManager.exists(userId)) return null; if (!sUserManager.exists(userId)) return Collections.emptyList(); ComponentName comp = intent.getComponent(); ComponentName comp = intent.getComponent(); if (comp == null) { if (comp == null) { if (intent.getSelector() != null) { if (intent.getSelector() != null) { Loading
services/java/com/android/server/pm/UserManagerService.java +29 −10 Original line number Original line Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.server.pm; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.FastXmlSerializer; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityManagerNative; import android.app.IStopUserCallback; import android.app.IStopUserCallback; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager; Loading Loading @@ -736,21 +738,38 @@ public class UserManagerService extends IUserManager.Stub { return res == ActivityManager.USER_OP_SUCCESS; return res == ActivityManager.USER_OP_SUCCESS; } } void finishRemoveUser(int userHandle) { void finishRemoveUser(final int userHandle) { if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle); if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle); // 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.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 (mInstallLock) { synchronized (mPackagesLock) { synchronized (mPackagesLock) { removeUserStateLocked(userHandle); removeUserStateLocked(userHandle); } } } } if (DBG) Slog.i(LOG_TAG, "Removed user " + userHandle + ", sending broadcast"); } // Let other services shutdown any activity }.start(); long ident = Binder.clearCallingIdentity(); } try { }, Intent addedIntent = new Intent(Intent.ACTION_USER_REMOVED); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); null, Activity.RESULT_OK, null, null); mContext.sendBroadcastAsUser(addedIntent, UserHandle.ALL, android.Manifest.permission.MANAGE_USERS); } finally { } finally { Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident); } } Loading
services/tests/servicestests/AndroidManifest.xml +1 −1 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,7 @@ <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <application> <application> <uses-library android:name="android.test.runner" /> <uses-library android:name="android.test.runner" /> Loading