From 06470b68e081913dcff7cd73b1bfa6c4f72ea82d Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Tue, 11 Apr 2017 14:30:33 -0700 Subject: [PATCH] Don't crash in SecondaryUserController. 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 --- .../storage/SecondaryUserController.java | 12 +++++++++--- .../storage/SecondaryUserControllerTest.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java index 62e946d2690..dec096488b5 100644 --- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java +++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java @@ -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 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); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java index c55ba36052c..963e35f1c5c 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/SecondaryUserControllerTest.java @@ -211,4 +211,20 @@ public class SecondaryUserControllerTest { Preference preference = argumentCaptor.getValue(); assertThat(preference.getIcon()).isEqualTo(drawable); } + + @Test + public void setIcon_doesntNpeOnNullPreference() throws Exception { + SparseArray 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 + } }