diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index b0b9e61ca21c4..075fb47cceac7 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -163,7 +163,8 @@ final class DeletePackageHelper { return PackageManager.DELETE_FAILED_INTERNAL_ERROR; } - if (PackageManagerServiceUtils.isSystemApp(uninstalledPs)) { + if (PackageManagerServiceUtils.isUpdatedSystemApp(uninstalledPs) + && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) { UserInfo userInfo = mUserManagerInternal.getUserInfo(userId); if (userInfo == null || (!userInfo.isAdmin() && !mUserManagerInternal.getUserInfo( mUserManagerInternal.getProfileParentId(userId)).isAdmin())) { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt index 69584e067de47..7ccd6d993f00f 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/DeletePackageHelperTest.kt @@ -70,13 +70,12 @@ class DeletePackageHelperTest { @Test fun deleteSystemPackageFailsIfNotAdminAndNotProfile() { val ps = mPms.mSettings.getPackageLPr("a.data.package") - whenever(PackageManagerServiceUtils.isSystemApp(ps)).thenReturn(true) + whenever(PackageManagerServiceUtils.isUpdatedSystemApp(ps)).thenReturn(true) whenever(mUserManagerInternal.getUserInfo(1)).thenReturn(UserInfo(1, "test", 0)) whenever(mUserManagerInternal.getProfileParentId(1)).thenReturn(1) val dph = DeletePackageHelper(mPms) - val result = dph.deletePackageX("a.data.package", 1L, 1, - PackageManager.DELETE_SYSTEM_APP, false) + val result = dph.deletePackageX("a.data.package", 1L, 1, 0, false) assertThat(result).isEqualTo(PackageManager.DELETE_FAILED_USER_RESTRICTED) } @@ -86,7 +85,7 @@ class DeletePackageHelperTest { val userId = 1 val parentId = 5 val ps = mPms.mSettings.getPackageLPr("a.data.package") - whenever(PackageManagerServiceUtils.isSystemApp(ps)).thenReturn(true) + whenever(PackageManagerServiceUtils.isUpdatedSystemApp(ps)).thenReturn(true) whenever(mUserManagerInternal.getUserInfo(userId)).thenReturn( UserInfo(userId, "test", UserInfo.FLAG_PROFILE)) whenever(mUserManagerInternal.getProfileParentId(userId)).thenReturn(parentId) @@ -94,8 +93,7 @@ class DeletePackageHelperTest { UserInfo(userId, "testparent", 0)) val dph = DeletePackageHelper(mPms) - val result = dph.deletePackageX("a.data.package", 1L, userId, - PackageManager.DELETE_SYSTEM_APP, false) + val result = dph.deletePackageX("a.data.package", 1L, userId, 0, false) assertThat(result).isEqualTo(PackageManager.DELETE_FAILED_USER_RESTRICTED) } @@ -132,4 +130,18 @@ class DeletePackageHelperTest { assertThat(result).isEqualTo(PackageManager.DELETE_SUCCEEDED) } -} \ No newline at end of file + + @Test + fun deleteSystemPackageSucceedsIfNotAdminButDeleteSystemAppSpecified() { + val ps = mPms.mSettings.getPackageLPr("a.data.package") + whenever(PackageManagerServiceUtils.isUpdatedSystemApp(ps)).thenReturn(true) + whenever(mUserManagerInternal.getUserInfo(1)).thenReturn(UserInfo(1, "test", 0)) + whenever(mUserManagerInternal.getProfileParentId(1)).thenReturn(1) + + val dph = DeletePackageHelper(mPms) + val result = dph.deletePackageX("a.data.package", 1L, 1, + PackageManager.DELETE_SYSTEM_APP, false) + + assertThat(result).isEqualTo(PackageManager.DELETE_SUCCEEDED) + } +}