diff options
6 files changed, 82 insertions, 2 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index 738caeca1b64..d25ced4aa2f1 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -61,6 +61,7 @@ package android.app { } public class ActivityTaskManager { + method public void clearLaunchParamsForPackages(java.util.List<java.lang.String>); method public java.lang.String listAllStacks(); method public void moveTaskToStack(int, int, boolean); method public boolean moveTopActivityToPinnedStack(int, android.graphics.Rect); diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java index 56ccf6f4a76f..6fdf7c8b4fac 100644 --- a/core/java/android/app/ActivityTaskManager.java +++ b/core/java/android/app/ActivityTaskManager.java @@ -433,4 +433,18 @@ public class ActivityTaskManager { } return sb.toString(); } + + /** + * Clears launch params for the given package. + * @param packageNames the names of the packages of which the launch params are to be cleared + */ + @TestApi + @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) + public void clearLaunchParamsForPackages(List<String> packageNames) { + try { + getService().clearLaunchParamsForPackages(packageNames); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index 09b77d5b8d0a..777a4949a132 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -445,4 +445,9 @@ interface IActivityTaskManager { void setPackageScreenCompatMode(in String packageName, int mode); boolean getPackageAskScreenCompat(in String packageName); void setPackageAskScreenCompat(in String packageName, boolean ask); + + /** + * Clears launch params for given packages. + */ + void clearLaunchParamsForPackages(in List<String> packageNames); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index d0e3fb47730e..99e1290628c4 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4508,6 +4508,21 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return mKeyguardController.isKeyguardLocked(); } + /** + * Clears launch params for the given package. + * @param packageNames the names of the packages of which the launch params are to be cleared + */ + @Override + public void clearLaunchParamsForPackages(List<String> packageNames) { + mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS, + "clearLaunchParamsForPackages"); + synchronized (mGlobalLock) { + for (int i = 0; i < packageNames.size(); ++i) { + mStackSupervisor.mLaunchParamsPersister.removeRecordForPackage(packageNames.get(i)); + } + } + } + void dumpLastANRLocked(PrintWriter pw) { pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)"); if (mLastANRState == null) { diff --git a/services/core/java/com/android/server/wm/LaunchParamsPersister.java b/services/core/java/com/android/server/wm/LaunchParamsPersister.java index 72d51439d9f7..c7089ac8ae05 100644 --- a/services/core/java/com/android/server/wm/LaunchParamsPersister.java +++ b/services/core/java/com/android/server/wm/LaunchParamsPersister.java @@ -268,7 +268,7 @@ class LaunchParamsPersister { outParams.mBounds.set(persistableParams.mBounds); } - private void onPackageRemoved(String packageName) { + void removeRecordForPackage(String packageName) { final List<File> fileToDelete = new ArrayList<>(); for (int i = 0; i < mMap.size(); ++i) { int userId = mMap.keyAt(i); @@ -309,7 +309,7 @@ class LaunchParamsPersister { @Override public void onPackageRemoved(String packageName) { - LaunchParamsPersister.this.onPackageRemoved(packageName); + removeRecordForPackage(packageName); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java index dc22bc1d5820..98413d95bb0a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsPersisterTests.java @@ -271,6 +271,51 @@ public class LaunchParamsPersisterTests extends ActivityTestsBase { } @Test + public void testClearsRecordInMemory() { + mTarget.saveTask(mTestTask); + + mTarget.removeRecordForPackage(TEST_COMPONENT.getPackageName()); + + mTarget.getLaunchParams(mTestTask, null, mResult); + + assertTrue("Result should be empty.", mResult.isEmpty()); + } + + @Test + public void testClearsWriteQueueItem() { + mTarget.saveTask(mTestTask); + + mTarget.removeRecordForPackage(TEST_COMPONENT.getPackageName()); + + final LaunchParamsPersister target = new LaunchParamsPersister(mPersisterQueue, mSupervisor, + mUserFolderGetter); + target.onSystemReady(); + target.onUnlockUser(TEST_USER_ID); + + target.getLaunchParams(mTestTask, null, mResult); + + assertTrue("Result should be empty.", mResult.isEmpty()); + } + + @Test + public void testClearsFile() { + mTarget.saveTask(mTestTask); + mPersisterQueue.flush(); + + mTarget.removeRecordForPackage(TEST_COMPONENT.getPackageName()); + + final LaunchParamsPersister target = new LaunchParamsPersister(mPersisterQueue, mSupervisor, + mUserFolderGetter); + target.onSystemReady(); + target.onUnlockUser(TEST_USER_ID); + + target.getLaunchParams(mTestTask, null, mResult); + + assertTrue("Result should be empty.", mResult.isEmpty()); + } + + + @Test public void testClearsRecordInMemoryOnPackageUninstalled() { mTarget.saveTask(mTestTask); |