UserHandle to UserSerialNo mapping
Use AtomicFile for usermanager files.
Added a MANAGE_USERS permission that apps (signature permission) can use
to create/query/modify/remove users.
Change-Id: I5cf232232d0539e7508df8ec9b216e29c2351cd9
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index a4d28b0..d61d9da 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -369,7 +369,7 @@
}
private void onUserRemoved(Intent intent) {
- int userId = intent.getIntExtra(Intent.EXTRA_USERID, -1);
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (userId < 1) return;
UserAccounts accounts;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index d325186..0190555 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2279,24 +2279,24 @@
"android.intent.action.PRE_BOOT_COMPLETED";
/**
- * Broadcast sent to the system when a user is added. Carries an extra EXTRA_USERID that has the
- * userid of the new user.
+ * Broadcast sent to the system when a user is added. Carries an extra EXTRA_USER_HANDLE that has the
+ * userHandle of the new user.
* @hide
*/
public static final String ACTION_USER_ADDED =
"android.intent.action.USER_ADDED";
/**
- * Broadcast sent to the system when a user is removed. Carries an extra EXTRA_USERID that has
- * the userid of the user.
+ * Broadcast sent to the system when a user is removed. Carries an extra EXTRA_USER_HANDLE that has
+ * the userHandle of the user.
* @hide
*/
public static final String ACTION_USER_REMOVED =
"android.intent.action.USER_REMOVED";
/**
- * Broadcast sent to the system when the user switches. Carries an extra EXTRA_USERID that has
- * the userid of the user to become the current one.
+ * Broadcast sent to the system when the user switches. Carries an extra EXTRA_USER_HANDLE that has
+ * the userHandle of the user to become the current one.
* @hide
*/
public static final String ACTION_USER_SWITCHED =
@@ -2852,12 +2852,12 @@
"android.intent.extra.LOCAL_ONLY";
/**
- * The userid carried with broadcast intents related to addition, removal and switching of users
+ * The userHandle carried with broadcast intents related to addition, removal and switching of users
* - {@link #ACTION_USER_ADDED}, {@link #ACTION_USER_REMOVED} and {@link #ACTION_USER_SWITCHED}.
* @hide
*/
- public static final String EXTRA_USERID =
- "android.intent.extra.user_id";
+ public static final String EXTRA_USER_HANDLE =
+ "android.intent.extra.user_handle";
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 3d3ff51..ee075b4 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -895,7 +895,7 @@
}
private void onUserRemoved(Intent intent) {
- int userId = intent.getIntExtra(Intent.EXTRA_USERID, -1);
+ int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (userId == -1) return;
// Clean up the storage engine database
diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java
index 638e273..060a235 100644
--- a/core/java/android/content/pm/UserInfo.java
+++ b/core/java/android/content/pm/UserInfo.java
@@ -53,6 +53,7 @@
public static final int FLAG_RESTRICTED = 0x00000008;
public int id;
+ public int serialNumber;
public String name;
public String iconPath;
public int flags;
@@ -88,6 +89,7 @@
iconPath = orig.iconPath;
id = orig.id;
flags = orig.flags;
+ serialNumber = orig.serialNumber;
}
@Override
@@ -104,6 +106,7 @@
dest.writeString(name);
dest.writeString(iconPath);
dest.writeInt(flags);
+ dest.writeInt(serialNumber);
}
public static final Parcelable.Creator<UserInfo> CREATOR
@@ -121,5 +124,6 @@
name = source.readString();
iconPath = source.readString();
flags = source.readInt();
+ serialNumber = source.readInt();
}
}
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index cb1b962..c7a8493 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -33,4 +33,6 @@
void setGuestEnabled(boolean enable);
boolean isGuestEnabled();
void wipeUser(int userHandle);
+ int getUserSerialNumber(int userHandle);
+ int getUserHandle(int userSerialNumber);
}
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 9c73392..93da44a 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -209,4 +209,40 @@
public int getMaxSupportedUsers() {
return mContext.getResources().getInteger(R.integer.config_multiuserMaximumUsers);
}
+
+ /**
+ * Returns a serial number on this device for a given userHandle. User handles can be recycled
+ * when deleting and creating users, but serial numbers are not reused until the device is wiped.
+ * @param userHandle
+ * @return a serial number associated with that user, or -1 if the userHandle is not valid.
+ * @hide
+ */
+ public int getUserSerialNumber(int userHandle) {
+ try {
+ return mService.getUserSerialNumber(userHandle);
+ } catch (RemoteException re) {
+ Log.w(TAG, "Could not get serial number for user " + userHandle);
+ }
+ return -1;
+ }
+
+ /**
+ * Returns a userHandle on this device for a given user serial number. User handles can be
+ * recycled when deleting and creating users, but serial numbers are not reused until the device
+ * is wiped.
+ * @param userSerialNumber
+ * @return the userHandle associated with that user serial number, or -1 if the serial number
+ * is not valid.
+ * @hide
+ */
+ public int getUserHandle(int userSerialNumber) {
+ try {
+ return mService.getUserHandle(userSerialNumber);
+ } catch (RemoteException re) {
+ Log.w(TAG, "Could not get userHandle for user " + userSerialNumber);
+ }
+ return -1;
+ }
+
+
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f0fe4a7..89be5cb 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -766,7 +766,6 @@
android:protectionLevel="dangerous"
android:label="@string/permlab_getTasks"
android:description="@string/permdesc_getTasks" />
-
<!-- Allows an application to call APIs that allow it to do interactions
across the users on the device, using singleton services and
user-targeted broadcasts. This permission is not available to
@@ -786,6 +785,15 @@
android:label="@string/permlab_interactAcrossUsersFull"
android:description="@string/permdesc_interactAcrossUsersFull" />
+ <!-- Allows an application to call APIs that allow it to query and manage
+ users on the device. This permission is not available to
+ third party applications. -->
+ <permission android:name="android.permission.MANAGE_USERS"
+ android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+ android:protectionLevel="signature"
+ android:label="@string/permlab_manageUsers"
+ android:description="@string/permdesc_manageUsers" />
+
<!-- Allows an application to get full detailed information about
recently running tasks, with full fidelity to the real state.
@hide -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 352c409..620a002 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -567,6 +567,11 @@
<string name="permdesc_interactAcrossUsersFull">Allows all possible interactions across
users.</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to create/remove/query users. [CHAR LIMIT=none] -->
+ <string name="permlab_manageUsers">manage users</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to create/remove/query users. [CHAR LIMIT=NONE] -->
+ <string name="permdesc_manageUsers">Allows apps to manage users on the device, including query, creation and deletion.</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=50] -->
<string name="permlab_getDetailedTasks">retrieve details of running apps</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE] -->