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:
@@ -325,7 +325,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
|
|||||||
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
|
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
|
||||||
final ApplicationsState.AppEntry appEntry =
|
final ApplicationsState.AppEntry appEntry =
|
||||||
mApplicationsState.getEntry(pkgName, mUserId);
|
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);
|
Log.d(TAG, "Not a user visible or instant app, skipping " + pkgName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -283,7 +283,7 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC
|
|||||||
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
|
// Not visible on launcher -> likely not a user visible app, skip if non-instant.
|
||||||
final ApplicationsState.AppEntry appEntry =
|
final ApplicationsState.AppEntry appEntry =
|
||||||
mApplicationsState.getEntry(pkgName, mUserId);
|
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);
|
Log.d(TAG, "Not a user visible or instant app, skipping " + pkgName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -247,6 +247,33 @@ public class RecentAppsPreferenceControllerTest {
|
|||||||
assertThat(prefs.get(0).getKey()).isEqualTo(stat2.mPackageName);
|
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
|
@Test
|
||||||
public void display_hasRecentButNoneDisplayable_showAppInfo() {
|
public void display_hasRecentButNoneDisplayable_showAppInfo() {
|
||||||
final List<UsageStats> stats = new ArrayList<>();
|
final List<UsageStats> stats = new ArrayList<>();
|
||||||
|
Reference in New Issue
Block a user