UserSwitcherControllerpublic class UserSwitcherController extends Object Keeps a list of all users on the device for user switching. |
Fields Summary |
---|
private static final String | TAG | private static final boolean | DEBUG | private static final String | SIMPLE_USER_SWITCHER_GLOBAL_SETTING | private final android.content.Context | mContext | private final android.os.UserManager | mUserManager | private final ArrayList | mAdapters | private final com.android.systemui.GuestResumeSessionReceiver | mGuestResumeSessionReceiver | private final KeyguardMonitor | mKeyguardMonitor | private ArrayList | mUsers | private android.app.Dialog | mExitGuestDialog | private android.app.Dialog | mAddUserDialog | private int | mLastNonGuestUser | private boolean | mSimpleUserSwitcher | private boolean | mAddUsersWhenLocked | private android.content.BroadcastReceiver | mReceiver | private final android.database.ContentObserver | mSettingsObserver | public final QSTile.DetailAdapter | userDetailAdapter | private final KeyguardMonitor.Callback | mCallback |
Constructors Summary |
---|
public UserSwitcherController(android.content.Context context, KeyguardMonitor keyguardMonitor)
mContext = context;
mGuestResumeSessionReceiver.register(context);
mKeyguardMonitor = keyguardMonitor;
mUserManager = UserManager.get(context);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_REMOVED);
filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_STOPPING);
mContext.registerReceiverAsUser(mReceiver, UserHandle.OWNER, filter,
null /* permission */, null /* scheduler */);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
mSettingsObserver);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.ADD_USERS_WHEN_LOCKED), true,
mSettingsObserver);
// Fetch initial values.
mSettingsObserver.onChange(false);
keyguardMonitor.addCallback(mCallback);
refreshUsers(UserHandle.USER_NULL);
|
Methods Summary |
---|
public void | dump(java.io.FileDescriptor fd, java.io.PrintWriter pw, java.lang.String[] args)
pw.println("UserSwitcherController state:");
pw.println(" mLastNonGuestUser=" + mLastNonGuestUser);
pw.print(" mUsers.size="); pw.println(mUsers.size());
for (int i = 0; i < mUsers.size(); i++) {
final UserRecord u = mUsers.get(i);
pw.print(" "); pw.println(u.toString());
}
| private void | exitGuest(int id)
int newId = UserHandle.USER_OWNER;
if (mLastNonGuestUser != UserHandle.USER_OWNER) {
UserInfo info = mUserManager.getUserInfo(mLastNonGuestUser);
if (info != null && info.isEnabled() && info.supportsSwitchTo()) {
newId = info.id;
}
}
switchToUserId(newId);
mUserManager.removeUser(id);
| public java.lang.String | getCurrentUserName(android.content.Context context)
if (mUsers.isEmpty()) return null;
UserRecord item = mUsers.get(0);
if (item == null || item.info == null) return null;
if (item.isGuest) return context.getString(R.string.guest_nickname);
return item.info.name;
| public boolean | isSimpleUserSwitcher()
return mSimpleUserSwitcher;
| public static boolean | isUserSwitcherAvailable(android.os.UserManager um)
return UserManager.supportsMultipleUsers() && um.isUserSwitcherEnabled();
| private void | notifyAdapters()
for (int i = mAdapters.size() - 1; i >= 0; i--) {
BaseUserAdapter adapter = mAdapters.get(i).get();
if (adapter != null) {
adapter.notifyDataSetChanged();
} else {
mAdapters.remove(i);
}
}
| private void | refreshUsers(int forcePictureLoadForId)Refreshes users from UserManager.
The pictures are only loaded if they have not been loaded yet.
SparseArray<Bitmap> bitmaps = new SparseArray<>(mUsers.size());
final int N = mUsers.size();
for (int i = 0; i < N; i++) {
UserRecord r = mUsers.get(i);
if (r == null || r.info == null
|| r.info.id == forcePictureLoadForId || r.picture == null) {
continue;
}
bitmaps.put(r.info.id, r.picture);
}
final boolean addUsersWhenLocked = mAddUsersWhenLocked;
new AsyncTask<SparseArray<Bitmap>, Void, ArrayList<UserRecord>>() {
@SuppressWarnings("unchecked")
@Override
protected ArrayList<UserRecord> doInBackground(SparseArray<Bitmap>... params) {
final SparseArray<Bitmap> bitmaps = params[0];
List<UserInfo> infos = mUserManager.getUsers(true);
if (infos == null) {
return null;
}
ArrayList<UserRecord> records = new ArrayList<>(infos.size());
int currentId = ActivityManager.getCurrentUser();
UserRecord guestRecord = null;
int avatarSize = mContext.getResources()
.getDimensionPixelSize(R.dimen.max_avatar_size);
for (UserInfo info : infos) {
boolean isCurrent = currentId == info.id;
if (info.isGuest()) {
guestRecord = new UserRecord(info, null /* picture */,
true /* isGuest */, isCurrent, false /* isAddUser */,
false /* isRestricted */);
} else if (info.supportsSwitchTo()) {
Bitmap picture = bitmaps.get(info.id);
if (picture == null) {
picture = mUserManager.getUserIcon(info.id);
if (picture != null) {
picture = BitmapHelper.createCircularClip(
picture, avatarSize, avatarSize);
}
}
int index = isCurrent ? 0 : records.size();
records.add(index, new UserRecord(info, picture, false /* isGuest */,
isCurrent, false /* isAddUser */, false /* isRestricted */));
}
}
boolean ownerCanCreateUsers = !mUserManager.hasUserRestriction(
UserManager.DISALLOW_ADD_USER, UserHandle.OWNER);
boolean currentUserCanCreateUsers =
(currentId == UserHandle.USER_OWNER) && ownerCanCreateUsers;
boolean anyoneCanCreateUsers = ownerCanCreateUsers && addUsersWhenLocked;
boolean canCreateGuest = (currentUserCanCreateUsers || anyoneCanCreateUsers)
&& guestRecord == null;
boolean canCreateUser = (currentUserCanCreateUsers || anyoneCanCreateUsers)
&& mUserManager.canAddMoreUsers();
boolean createIsRestricted = !addUsersWhenLocked;
if (!mSimpleUserSwitcher) {
if (guestRecord == null) {
if (canCreateGuest) {
records.add(new UserRecord(null /* info */, null /* picture */,
true /* isGuest */, false /* isCurrent */,
false /* isAddUser */, createIsRestricted));
}
} else {
int index = guestRecord.isCurrent ? 0 : records.size();
records.add(index, guestRecord);
}
}
if (!mSimpleUserSwitcher && canCreateUser) {
records.add(new UserRecord(null /* info */, null /* picture */,
false /* isGuest */, false /* isCurrent */, true /* isAddUser */,
createIsRestricted));
}
return records;
}
@Override
protected void onPostExecute(ArrayList<UserRecord> userRecords) {
if (userRecords != null) {
mUsers = userRecords;
notifyAdapters();
}
}
}.execute((SparseArray) bitmaps);
| private void | showAddUserDialog()
if (mAddUserDialog != null && mAddUserDialog.isShowing()) {
mAddUserDialog.cancel();
}
mAddUserDialog = new AddUserDialog(mContext);
mAddUserDialog.show();
| private void | showExitGuestDialog(int id)
if (mExitGuestDialog != null && mExitGuestDialog.isShowing()) {
mExitGuestDialog.cancel();
}
mExitGuestDialog = new ExitGuestDialog(mContext, id);
mExitGuestDialog.show();
| public void | switchTo(com.android.systemui.statusbar.policy.UserSwitcherController$UserRecord record)
int id;
if (record.isGuest && record.info == null) {
// No guest user. Create one.
UserInfo guest = mUserManager.createGuest(
mContext, mContext.getString(R.string.guest_nickname));
if (guest == null) {
// Couldn't create guest, most likely because there already exists one, we just
// haven't reloaded the user list yet.
return;
}
id = guest.id;
} else if (record.isAddUser) {
showAddUserDialog();
return;
} else {
id = record.info.id;
}
if (ActivityManager.getCurrentUser() == id) {
if (record.isGuest) {
showExitGuestDialog(id);
}
return;
}
switchToUserId(id);
| private void | switchToUserId(int id)
try {
ActivityManagerNative.getDefault().switchUser(id);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't switch user.", e);
}
|
|