Skip to content

Commit f83d2d6

Browse files
Amith YamasaniAndroid (Google) Code Review
authored andcommitted
Merge "User Manager service to manage users and query user details" into jb-mr1-dev
2 parents f7178d3 + 258848d commit f83d2d6

File tree

30 files changed

+588
-377
lines changed

30 files changed

+588
-377
lines changed

Android.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ LOCAL_SRC_FILES += \
139139
core/java/android/os/IRemoteCallback.aidl \
140140
core/java/android/os/ISchedulingPolicyService.aidl \
141141
core/java/android/os/IUpdateLock.aidl \
142+
core/java/android/os/IUserManager.aidl \
142143
core/java/android/os/IVibratorService.aidl \
143144
core/java/android/service/dreams/IDreamManager.aidl \
144145
core/java/android/service/dreams/IDreamService.aidl \

api/current.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5386,6 +5386,7 @@ package android.content {
53865386
field public static final java.lang.String TEXT_SERVICES_MANAGER_SERVICE = "textservices";
53875387
field public static final java.lang.String UI_MODE_SERVICE = "uimode";
53885388
field public static final java.lang.String USB_SERVICE = "usb";
5389+
field public static final java.lang.String USER_SERVICE = "user";
53895390
field public static final java.lang.String VIBRATOR_SERVICE = "vibrator";
53905391
field public static final java.lang.String WALLPAPER_SERVICE = "wallpaper";
53915392
field public static final java.lang.String WIFI_P2P_SERVICE = "wifip2p";
@@ -16448,6 +16449,11 @@ package android.os {
1644816449
ctor public TransactionTooLargeException();
1644916450
}
1645016451

16452+
public class UserManager {
16453+
method public java.lang.String getUserName();
16454+
method public boolean supportsMultipleUsers();
16455+
}
16456+
1645116457
public abstract class Vibrator {
1645216458
method public abstract void cancel();
1645316459
method public abstract boolean hasVibrator();

cmds/pm/src/com/android/commands/pm/Pm.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import android.app.ActivityManagerNative;
2222
import android.content.ComponentName;
23+
import android.content.Context;
2324
import android.content.pm.ApplicationInfo;
2425
import android.content.pm.ContainerEncryptionParams;
2526
import android.content.pm.FeatureInfo;
@@ -39,9 +40,11 @@
3940
import android.content.res.Resources;
4041
import android.net.Uri;
4142
import android.os.Binder;
43+
import android.os.IUserManager;
4244
import android.os.Process;
4345
import android.os.RemoteException;
4446
import android.os.ServiceManager;
47+
import android.os.UserManager;
4548

4649
import java.io.File;
4750
import java.lang.reflect.Field;
@@ -59,6 +62,7 @@
5962

6063
public final class Pm {
6164
IPackageManager mPm;
65+
IUserManager mUm;
6266

6367
private WeakHashMap<String, Resources> mResourceCache
6468
= new WeakHashMap<String, Resources>();
@@ -82,6 +86,7 @@ public void run(String[] args) {
8286
return;
8387
}
8488

89+
mUm = IUserManager.Stub.asInterface(ServiceManager.getService("user"));
8590
mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
8691
if (mPm == null) {
8792
System.err.println(PM_NOT_RUNNING_ERR);
@@ -985,7 +990,7 @@ public void runCreateUser() {
985990
}
986991
name = arg;
987992
try {
988-
if (mPm.createUser(name, 0) == null) {
993+
if (mUm.createUser(name, 0) == null) {
989994
System.err.println("Error: couldn't create User.");
990995
showUsage();
991996
}
@@ -1017,7 +1022,7 @@ public void runRemoveUser() {
10171022
return;
10181023
}
10191024
try {
1020-
if (!mPm.removeUser(userId)) {
1025+
if (!mUm.removeUser(userId)) {
10211026
System.err.println("Error: couldn't remove user.");
10221027
showUsage();
10231028
}
@@ -1034,7 +1039,7 @@ public void runListUsers() {
10341039
return;
10351040
}
10361041
try {
1037-
List<UserInfo> users = mPm.getUsers();
1042+
List<UserInfo> users = mUm.getUsers();
10381043
if (users == null) {
10391044
System.err.println("Error: couldn't get users");
10401045
} else {

core/java/android/accounts/AccountManagerService.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import android.os.RemoteException;
5252
import android.os.SystemClock;
5353
import android.os.UserId;
54+
import android.os.UserManager;
5455
import android.text.TextUtils;
5556
import android.util.Log;
5657
import android.util.Pair;
@@ -92,6 +93,7 @@ public class AccountManagerService
9293
private final Context mContext;
9394

9495
private final PackageManager mPackageManager;
96+
private UserManager mUserManager;
9597

9698
private HandlerThread mMessageThread;
9799
private final MessageHandler mMessageHandler;
@@ -245,6 +247,13 @@ public void systemReady() {
245247
initUser(0);
246248
}
247249

250+
private UserManager getUserManager() {
251+
if (mUserManager == null) {
252+
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
253+
}
254+
return mUserManager;
255+
}
256+
248257
private UserAccounts initUser(int userId) {
249258
synchronized (mUsers) {
250259
UserAccounts accounts = mUsers.get(userId);
@@ -382,12 +391,7 @@ private void onUserRemoved(Intent intent) {
382391
}
383392

384393
private List<UserInfo> getAllUsers() {
385-
try {
386-
return AppGlobals.getPackageManager().getUsers();
387-
} catch (RemoteException re) {
388-
// Local to system process, shouldn't happen
389-
}
390-
return null;
394+
return getUserManager().getUsers();
391395
}
392396

393397
public void onServiceChanged(AuthenticatorDescription desc, boolean removed) {

core/java/android/app/ApplicationPackageManager.java

Lines changed: 1 addition & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
import android.content.pm.ProviderInfo;
4242
import android.content.pm.ResolveInfo;
4343
import android.content.pm.ServiceInfo;
44-
import android.content.pm.UserInfo;
4544
import android.content.pm.ManifestDigest;
45+
import android.content.pm.UserInfo;
4646
import android.content.pm.VerifierDeviceIdentity;
4747
import android.content.res.Resources;
4848
import android.content.res.XmlResourceParser;
@@ -1182,80 +1182,6 @@ public int getApplicationEnabledSetting(String packageName) {
11821182
return PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
11831183
}
11841184

1185-
// Multi-user support
1186-
1187-
/**
1188-
* @hide
1189-
*/
1190-
@Override
1191-
public UserInfo createUser(String name, int flags) {
1192-
try {
1193-
return mPM.createUser(name, flags);
1194-
} catch (RemoteException e) {
1195-
// Should never happen!
1196-
}
1197-
return null;
1198-
}
1199-
1200-
/**
1201-
* @hide
1202-
*/
1203-
@Override
1204-
public List<UserInfo> getUsers() {
1205-
try {
1206-
return mPM.getUsers();
1207-
} catch (RemoteException re) {
1208-
ArrayList<UserInfo> users = new ArrayList<UserInfo>();
1209-
UserInfo primary = new UserInfo(0, "Root!", null,
1210-
UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY);
1211-
users.add(primary);
1212-
return users;
1213-
}
1214-
}
1215-
1216-
/**
1217-
* @hide
1218-
*/
1219-
@Override
1220-
public UserInfo getUser(int userId) {
1221-
try {
1222-
return mPM.getUser(userId);
1223-
} catch (RemoteException re) {
1224-
return null;
1225-
}
1226-
}
1227-
1228-
/**
1229-
* @hide
1230-
*/
1231-
@Override
1232-
public boolean removeUser(int id) {
1233-
try {
1234-
return mPM.removeUser(id);
1235-
} catch (RemoteException e) {
1236-
return false;
1237-
}
1238-
}
1239-
1240-
/**
1241-
* @hide
1242-
*/
1243-
@Override
1244-
public void setUserName(int id, String name) {
1245-
try {
1246-
mPM.setUserName(id, name);
1247-
} catch (RemoteException re) {
1248-
}
1249-
}
1250-
1251-
/**
1252-
* @hide
1253-
*/
1254-
@Override
1255-
public void updateUserFlags(int id, int flags) {
1256-
// TODO:
1257-
}
1258-
12591185
/**
12601186
* @hide
12611187
*/

core/java/android/app/ContextImpl.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,15 @@
8080
import android.os.Handler;
8181
import android.os.IBinder;
8282
import android.os.IPowerManager;
83+
import android.os.IUserManager;
8384
import android.os.Looper;
8485
import android.os.PowerManager;
8586
import android.os.Process;
8687
import android.os.RemoteException;
8788
import android.os.ServiceManager;
8889
import android.os.UserId;
8990
import android.os.SystemVibrator;
91+
import android.os.UserManager;
9092
import android.os.storage.StorageManager;
9193
import android.telephony.TelephonyManager;
9294
import android.content.ClipboardManager;
@@ -498,6 +500,13 @@ public Object getService(ContextImpl ctx) {
498500
return WindowManagerImpl.getDefault().makeCompatible(
499501
ctx.mPackageInfo.mCompatibilityInfo);
500502
}});
503+
504+
registerService(USER_SERVICE, new ServiceFetcher() {
505+
public Object getService(ContextImpl ctx) {
506+
IBinder b = ServiceManager.getService(USER_SERVICE);
507+
IUserManager service = IUserManager.Stub.asInterface(b);
508+
return new UserManager(ctx, service);
509+
}});
501510
}
502511

503512
static ContextImpl getImpl(Context context) {
@@ -918,6 +927,18 @@ public void startActivity(Intent intent, Bundle options) {
918927
(Activity)null, intent, -1, options);
919928
}
920929

930+
/** @hide */
931+
@Override
932+
public void startActivityAsUser(Intent intent, Bundle options, int userId) {
933+
try {
934+
ActivityManagerNative.getDefault().startActivityAsUser(
935+
mMainThread.getApplicationThread(), intent,
936+
intent.resolveTypeIfNeeded(getContentResolver()),
937+
null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, null, options, userId);
938+
} catch (RemoteException re) {
939+
}
940+
}
941+
921942
@Override
922943
public void startActivities(Intent[] intents) {
923944
startActivities(intents, null);

core/java/android/content/Context.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,22 @@ public void startActivityAsUser(Intent intent, int userId) {
889889
*/
890890
public abstract void startActivity(Intent intent, Bundle options);
891891

892+
/**
893+
* Same as {@link #startActivity(Intent, Bundle)}, but for a specific user. It requires holding
894+
* the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission.
895+
* @param intent The description of the activity to start.
896+
* @param options Additional options for how the Activity should be started.
897+
* May be null if there are no options. See {@link android.app.ActivityOptions}
898+
* for how to build the Bundle supplied here; there are no supported definitions
899+
* for building it manually.
900+
* @param userId The user id of the user to start this activity for.
901+
* @throws ActivityNotFoundException
902+
* @hide
903+
*/
904+
public void startActivityAsUser(Intent intent, Bundle options, int userId) {
905+
throw new RuntimeException("Not implemented. Must override in a subclass.");
906+
}
907+
892908
/**
893909
* Same as {@link #startActivities(Intent[], Bundle)} with no options
894910
* specified.
@@ -2017,6 +2033,15 @@ public abstract boolean startInstrumentation(ComponentName className,
20172033
*/
20182034
public static final String SCHEDULING_POLICY_SERVICE = "scheduling_policy";
20192035

2036+
/**
2037+
* Use with {@link #getSystemService} to retrieve a
2038+
* {@link android.os.UserManager} for managing users on devices that support multiple users.
2039+
*
2040+
* @see #getSystemService
2041+
* @see android.os.UserManager
2042+
*/
2043+
public static final String USER_SERVICE = "user";
2044+
20202045
/**
20212046
* Determine whether the given permission is allowed for a particular
20222047
* process and user ID running in the system.

core/java/android/content/ContextWrapper.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,12 @@ public void startActivity(Intent intent, Bundle options) {
287287
mBase.startActivity(intent, options);
288288
}
289289

290+
/** @hide */
291+
@Override
292+
public void startActivityAsUser(Intent intent, Bundle options, int userId) {
293+
mBase.startActivityAsUser(intent, options, userId);
294+
}
295+
290296
@Override
291297
public void startActivities(Intent[] intents) {
292298
mBase.startActivities(intents);

core/java/android/content/SyncManager.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import android.os.SystemClock;
5454
import android.os.SystemProperties;
5555
import android.os.UserId;
56+
import android.os.UserManager;
5657
import android.os.WorkSource;
5758
import android.provider.Settings;
5859
import android.text.format.DateUtils;
@@ -206,16 +207,20 @@ public void onReceive(Context context, Intent intent) {
206207
// Use this as a random offset to seed all periodic syncs
207208
private int mSyncRandomOffsetMillis;
208209

210+
private UserManager mUserManager;
211+
209212
private static final long SYNC_ALARM_TIMEOUT_MIN = 30 * 1000; // 30 seconds
210213
private static final long SYNC_ALARM_TIMEOUT_MAX = 2 * 60 * 60 * 1000; // two hours
211214

212-
private List<UserInfo> getAllUsers() {
213-
try {
214-
return AppGlobals.getPackageManager().getUsers();
215-
} catch (RemoteException re) {
216-
// Local to system process, shouldn't happen
215+
private UserManager getUserManager() {
216+
if (mUserManager == null) {
217+
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
217218
}
218-
return null;
219+
return mUserManager;
220+
}
221+
222+
private List<UserInfo> getAllUsers() {
223+
return getUserManager().getUsers();
219224
}
220225

221226
private boolean containsAccountAndUser(AccountAndUser[] accounts, Account account, int userId) {

core/java/android/content/pm/IPackageManager.aidl

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -358,11 +358,6 @@ interface IPackageManager {
358358
boolean setInstallLocation(int loc);
359359
int getInstallLocation();
360360

361-
UserInfo createUser(in String name, int flags);
362-
boolean removeUser(int userId);
363-
void setUserName(int userId, String name);
364-
ParcelFileDescriptor setUserIcon(int userId);
365-
366361
void installPackageWithVerification(in Uri packageURI, in IPackageInstallObserver observer,
367362
int flags, in String installerPackageName, in Uri verificationURI,
368363
in ManifestDigest manifestDigest, in ContainerEncryptionParams encryptionParams);
@@ -373,9 +368,6 @@ interface IPackageManager {
373368

374369
boolean isFirstBoot();
375370

376-
List<UserInfo> getUsers();
377-
UserInfo getUser(int userId);
378-
379371
void setPermissionEnforced(String permission, boolean enforced);
380372
boolean isPermissionEnforced(String permission);
381373

0 commit comments

Comments
 (0)