Prevent crash in recent app list

In some situations if you have recently used an app and then uninstalled
it, the display of recent apps in Settings->Apps & notifications would
crash. This is due to a bug in recent CL that fixed b/71591298.

Test: make -j64 RunSettingsRoboTests
Change-Id: Id04b073b2617eeff0e188b10d3743496a9f70d5e
Fixes: 72340364
This commit is contained in:
Antony Sargent
2018-01-24 16:14:16 -08:00
parent c9afb5915c
commit e04101be07
3 changed files with 29 additions and 2 deletions

View File

@@ -325,7 +325,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
final ApplicationsState.AppEntry appEntry =
mApplicationsState.getEntry(pkgName, mUserId);
if (!AppUtils.isInstant(appEntry.info)) {
if (appEntry == null || appEntry.info == null || !AppUtils.isInstant(appEntry.info)) {
Log.d(TAG, "Not a user visible or instant app, skipping " + pkgName);
return false;
}

View File

@@ -283,7 +283,7 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
final ApplicationsState.AppEntry appEntry =
mApplicationsState.getEntry(pkgName, mUserId);
if (!AppUtils.isInstant(appEntry.info)) {
if (appEntry == null || appEntry.info == null || !AppUtils.isInstant(appEntry.info)) {
Log.d(TAG, "Not a user visible or instant app, skipping " + pkgName);
return false;
}

View File

@@ -247,6 +247,33 @@ public class RecentAppsPreferenceControllerTest {
assertThat(prefs.get(0).getKey()).isEqualTo(stat2.mPackageName);
}
@Test
public void display_showRecentsWithNullAppEntryOrInfo() {
final List<UsageStats> stats = new ArrayList<>();
final UsageStats stat1 = new UsageStats();
final UsageStats stat2 = new UsageStats();
stat1.mLastTimeUsed = System.currentTimeMillis();
stat1.mPackageName = "pkg.class";
stats.add(stat1);
stat2.mLastTimeUsed = System.currentTimeMillis();
stat2.mPackageName = "pkg.class2";
stats.add(stat2);
// app1 has AppEntry with null info, app2 has null AppEntry.
mAppEntry.info = null;
when(mAppState.getEntry(stat1.mPackageName, UserHandle.myUserId()))
.thenReturn(mAppEntry);
when(mAppState.getEntry(stat2.mPackageName, UserHandle.myUserId()))
.thenReturn(null);
when(mUsageStatsManager.queryUsageStats(anyInt(), anyLong(), anyLong()))
.thenReturn(stats);
// We should not crash here.
mController.displayPreference(mScreen);
}
@Test
public void display_hasRecentButNoneDisplayable_showAppInfo() {
final List<UsageStats> stats = new ArrayList<>();