Merge "Only keep user switcher bitmaps if needed" into lmp-mr1-dev
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 3f99630..f5c994a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -860,6 +860,10 @@
         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 void setQsExpanded(boolean expanded) {
         mStatusBarWindowManager.setQsExpanded(expanded);
+        if (mUserSwitcherController != null) {
+            mUserSwitcherController.setQsExpanded(expanded);
+        }
     }
 
     public boolean isGoingToNotificationShade() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
index 7ee1fc5..0392e0d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
@@ -227,6 +227,10 @@
         }
     };
 
+    public boolean isEnabled() {
+        return mUserSwitcherContainer != null;
+    }
+
     public static class Adapter extends UserSwitcherController.BaseUserAdapter implements
             View.OnClickListener {
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 6ef4cff..5f6c399 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -78,6 +78,9 @@
     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 @@
      */
     @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 @@
                                 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 @@
         }
     }
 
+    /**
+     * 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 {