Fix 2 LaunchParamsPersister issues

The first one is it erroneously accepts tasks with null realActivity. It
shouldn't save launch params for such tasks.

The second one is when it receives a package removed notification from
PackageManagerService, it touches mLaunchParamsMap without holding WM
global lock.

Bug: 186696426
Test: atest LaunchParamsPersister
Change-Id: Ib0159835f177b7a3e9208bf77b3b608920262588
This commit is contained in:
Garfield Tan
2021-04-29 13:47:27 -07:00
parent 43c67441e0
commit 6ba68bb08a
2 changed files with 21 additions and 5 deletions

View File

@@ -232,6 +232,9 @@ class LaunchParamsPersister {
void saveTask(Task task, DisplayContent display) {
final ComponentName name = task.realActivity;
if (name == null) {
return;
}
final int userId = task.mUserId;
PersistableLaunchParams params;
ArrayMap<ComponentName, PersistableLaunchParams> map = mLaunchParamsMap.get(userId);
@@ -381,11 +384,13 @@ class LaunchParamsPersister {
private class PackageListObserver implements PackageManagerInternal.PackageListObserver {
@Override
public void onPackageAdded(String packageName, int uid) { }
public void onPackageAdded(String packageName, int uid) {}
@Override
public void onPackageRemoved(String packageName, int uid) {
removeRecordForPackage(packageName);
synchronized (mSupervisor.mService.getGlobalLock()) {
removeRecordForPackage(packageName);
}
}
}

View File

@@ -114,10 +114,10 @@ public class LaunchParamsPersisterTests extends WindowTestsBase {
when(mRootWindowContainer.getDisplayContent(eq(mDisplayUniqueId)))
.thenReturn(mTestDisplay);
Task stack = mTestDisplay.getDefaultTaskDisplayArea()
Task rootTask = mTestDisplay.getDefaultTaskDisplayArea()
.createRootTask(TEST_WINDOWING_MODE, ACTIVITY_TYPE_STANDARD, /* onTop */ true);
mTestTask = new TaskBuilder(mSupervisor).setComponent(TEST_COMPONENT).setParentTask(stack)
.build();
mTestTask = new TaskBuilder(mSupervisor).setComponent(TEST_COMPONENT)
.setParentTask(rootTask).build();
mTestTask.mUserId = TEST_USER_ID;
mTestTask.mLastNonFullscreenBounds = TEST_BOUNDS;
mTestTask.setHasBeenVisible(true);
@@ -157,6 +157,17 @@ public class LaunchParamsPersisterTests extends WindowTestsBase {
assertTrue("Default result should be empty.", mResult.isEmpty());
}
@Test
public void testSavingTestWithoutRealActivityWontMakePackageRemovalCrash() {
Task rootTask = mTestDisplay.getDefaultTaskDisplayArea()
.createRootTask(TEST_WINDOWING_MODE, ACTIVITY_TYPE_STANDARD, /* onTop */ true);
assertNull(rootTask.realActivity);
mTarget.saveTask(rootTask);
mTarget.removeRecordForPackage(TEST_COMPONENT.getPackageName());
}
@Test
public void testSavesAndRestoresLaunchParamsInSameInstance() {
mTarget.saveTask(mTestTask);