Only keep user switcher bitmaps if needed

Only keeps icons if the user switcher is accessible. On phones, this
is any time quick settings is expanded. On tablets, this would be whenever
the keyguard shows. Reloading them on each screen off transition seems too
wasteful however, so we keep them in-memory all the time on tablets.

Bug: 18350670
Change-Id: I416beb82156787e61ee1f59b6726fd702f135f68
This commit is contained in:
Adrian Roos
2014-11-17 17:41:28 +01:00
parent 2b154a9ec3
commit cba0faadbe
3 changed files with 60 additions and 16 deletions

View File

@@ -860,6 +860,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
(ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
mKeyguardStatusBar, mNotificationPanel, mUserSwitcherController);
if (mUserSwitcherController != null) {
mUserSwitcherController.setKeyguardUserSwitcherAvailable(
mKeyguardUserSwitcher.isEnabled());
}
// Set up the quick settings tile panel
@@ -2126,6 +2130,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
public void setQsExpanded(boolean expanded) {
mStatusBarWindowManager.setQsExpanded(expanded);
if (mUserSwitcherController != null) {
mUserSwitcherController.setQsExpanded(expanded);
}
}
public boolean isGoingToNotificationShade() {

View File

@@ -227,6 +227,10 @@ public class KeyguardUserSwitcher {
}
};
public boolean isEnabled() {
return mUserSwitcherContainer != null;
}
public static class Adapter extends UserSwitcherController.BaseUserAdapter implements
View.OnClickListener {

View File

@@ -78,6 +78,9 @@ public class UserSwitcherController {
private boolean mSimpleUserSwitcher;
private boolean mAddUsersWhenLocked;
private boolean mKeyguardUserSwitcherAvailable;
private boolean mQsExpanded;
public UserSwitcherController(Context context, KeyguardMonitor keyguardMonitor) {
mContext = context;
mGuestResumeSessionReceiver.register(context);
@@ -116,16 +119,18 @@ public class UserSwitcherController {
*/
@SuppressWarnings("unchecked")
private void refreshUsers(int forcePictureLoadForId) {
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;
SparseArray<Bitmap> bitmaps = null;
if (allowCachingOfBitmaps()) {
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);
}
bitmaps.put(r.info.id, r.picture);
}
final boolean addUsersWhenLocked = mAddUsersWhenLocked;
@@ -151,13 +156,15 @@ public class UserSwitcherController {
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);
Bitmap picture = bitmaps != null ? bitmaps.get(info.id) : null;
if (picture == null && allowCachingOfBitmaps()) {
Bitmap loadedPicture = mUserManager.getUserIcon(info.id);
if (loadedPicture != null) {
picture = BitmapHelper.createCircularClip(
loadedPicture, avatarSize, avatarSize);
loadedPicture.recycle();
}
}
int index = isCurrent ? 0 : records.size();
records.add(index, new UserRecord(info, picture, false /* isGuest */,
@@ -552,6 +559,32 @@ public class UserSwitcherController {
}
}
/**
* Notify if the keyguard user switcher is available.
*/
public void setKeyguardUserSwitcherAvailable(boolean available) {
boolean oldShouldCacheBitmaps = allowCachingOfBitmaps();
mKeyguardUserSwitcherAvailable = available;
if (allowCachingOfBitmaps() != oldShouldCacheBitmaps) {
refreshUsers(UserHandle.USER_NULL);
}
}
/**
* Notify if the quick settings are expanded.
*/
public void setQsExpanded(boolean qsExpanded) {
boolean oldShouldCacheBitmaps = allowCachingOfBitmaps();
mQsExpanded = qsExpanded;
if (allowCachingOfBitmaps() != oldShouldCacheBitmaps) {
refreshUsers(UserHandle.USER_NULL);
}
}
private boolean allowCachingOfBitmaps() {
return mQsExpanded || mKeyguardUserSwitcherAvailable;
}
private final class AddUserDialog extends SystemUIDialog implements
DialogInterface.OnClickListener {