Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06470b68 authored by Daniel Nishi's avatar Daniel Nishi
Browse files

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
parent 8bb9f33c
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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);
        }
    }

+16 −0
Original line number Diff line number Diff line
@@ -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
    }
}