OSDN Git Service

Don't crash in SecondaryUserController.
authorDaniel Nishi <dhnishi@google.com>
Tue, 11 Apr 2017 21:30:33 +0000 (14:30 -0700)
committerDaniel Nishi <dhnishi@google.com>
Wed, 12 Apr 2017 16:33:32 +0000 (09:33 -0700)
If icons were fetched before displayPreference() is called, it can
cause a NPE. This adds a null check to ensure that it never
attempts to set an icon without both the icon and preference being
non-null.

Change-Id: Ib4269428e64545c9e255f7e3292fb6c046c1f307
Fixes: 37248158
Test: Settings Robotest

src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java

index 62e946d..dec0964 100644 (file)
@@ -48,6 +48,7 @@ public class SecondaryUserController extends PreferenceController
 
     private @NonNull UserInfo mUser;
     private @Nullable StorageItemPreference mStoragePreference;
+    private Drawable mUserIcon;
     private long mSize;
     private long mTotalSizeBytes;
 
@@ -113,6 +114,7 @@ public class SecondaryUserController extends PreferenceController
 
             group.setVisible(true);
             group.addPreference(mStoragePreference);
+            maybeSetIcon();
         }
     }
 
@@ -163,9 +165,13 @@ public class SecondaryUserController extends PreferenceController
 
     @Override
     public void handleUserIcons(SparseArray<Drawable> fetchedIcons) {
-        Drawable userIcon = fetchedIcons.get(mUser.id);
-        if (userIcon != null) {
-            mStoragePreference.setIcon(userIcon);
+        mUserIcon = fetchedIcons.get(mUser.id);
+        maybeSetIcon();
+    }
+
+    private void maybeSetIcon() {
+        if (mUserIcon != null && mStoragePreference != null) {
+            mStoragePreference.setIcon(mUserIcon);
         }
     }
 
index c55ba36..963e35f 100644 (file)
@@ -211,4 +211,20 @@ public class SecondaryUserControllerTest {
         Preference preference = argumentCaptor.getValue();
         assertThat(preference.getIcon()).isEqualTo(drawable);
     }
+
+    @Test
+    public void setIcon_doesntNpeOnNullPreference() throws Exception {
+        SparseArray<Drawable> icons = new SparseArray<>();
+        Bitmap userBitmap =
+                BitmapFactory.decodeResource(
+                        RuntimeEnvironment.application.getResources(), R.drawable.home);
+        UserIconDrawable drawable = new UserIconDrawable(100 /* size */).setIcon(userBitmap).bake();
+        icons.put(10, drawable);
+        mPrimaryUser.name = TEST_NAME;
+        mPrimaryUser.id = 10;
+
+        mController.handleUserIcons(icons);
+
+        // Doesn't crash
+    }
 }