From c445b83bccb5fb9c607409cf76328879771bc63f Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Tue, 18 Apr 2023 22:59:59 +0800 Subject: [PATCH] Fix NPE of ApplicationsState Check userId before getting the entry from mEntriesMap to avoid NPE in getEntryLocked(), since the caller from RecentAppStatsMixin may query the entry of uncached userId. Bug: 278034297 Test: manual && robotests Change-Id: Ia2ff912403a33b2b94cae5138406154e9fee6adf --- .../applications/ApplicationsState.java | 5 ++++- .../ApplicationsStateRoboTest.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 5e8f3a18cbc0e..fe8988385453d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -734,7 +734,10 @@ public class ApplicationsState { private AppEntry getEntryLocked(ApplicationInfo info) { int userId = UserHandle.getUserId(info.uid); - AppEntry entry = mEntriesMap.get(userId).get(info.packageName); + AppEntry entry = null; + if (mEntriesMap.contains(userId)) { + entry = mEntriesMap.get(userId).get(info.packageName); + } if (DEBUG) { Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java index 96e64ea1de71f..1d081d7214cc6 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java @@ -89,6 +89,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.UUID; @@ -801,4 +802,21 @@ public class ApplicationsStateRoboTest { assertThat(nonPrimaryUserApp1.shouldShowInPersonalTab(um, appInfo1.uid)).isTrue(); assertThat(nonPrimaryUserApp2.shouldShowInPersonalTab(um, appInfo2.uid)).isFalse(); } + + @Test + public void getEntry_validUserId_shouldReturnEntry() { + mApplicationsState.mEntriesMap.put(/* userId= */ 0, new HashMap<>()); + addApp(PKG_1, /* id= */ 1); + + assertThat(mApplicationsState.getEntry(PKG_1, /* userId= */ 0).info.packageName) + .isEqualTo(PKG_1); + } + + @Test + public void getEntry_invalidUserId_shouldReturnNull() { + mApplicationsState.mEntriesMap.put(/* userId= */ 0, new HashMap<>()); + addApp(PKG_1, /* id= */ 1); + + assertThat(mApplicationsState.getEntry(PKG_1, /* userId= */ -1)).isNull(); + } }