Loading services/core/java/com/android/server/pm/PackageManagerService.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3409,7 +3409,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } @Nullable @Nullable private String getDevicePolicyManagementRoleHolderPackageName(int userId) { public String getDevicePolicyManagementRoleHolderPackageName(int userId) { return Binder.withCleanCallingIdentity(() -> { return Binder.withCleanCallingIdentity(() -> { RoleManager roleManager = mContext.getSystemService(RoleManager.class); RoleManager roleManager = mContext.getSystemService(RoleManager.class); List<String> roleHolders = List<String> roleHolders = Loading services/core/java/com/android/server/pm/SuspendPackageHelper.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -724,6 +724,10 @@ public final class SuspendPackageHelper { for (PackageInfo info : pkgInfos) { for (PackageInfo info : pkgInfos) { result.add(info.packageName); result.add(info.packageName); } } // Role holder may be null, but ArraySet handles it correctly. result.remove(mPm.getDevicePolicyManagementRoleHolderPackageName(userId)); return result; return result; } } Loading services/core/java/com/android/server/wm/ActivityStartInterceptor.java +16 −2 Original line number Original line Diff line number Diff line Loading @@ -280,6 +280,10 @@ class ActivityStartInterceptor { return false; return false; } } if (isKeepProfilesRunningEnabled() && !isPackageSuspended()) { return false; } IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT); FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT); Loading Loading @@ -322,8 +326,7 @@ class ActivityStartInterceptor { private boolean interceptSuspendedPackageIfNeeded() { private boolean interceptSuspendedPackageIfNeeded() { // Do not intercept if the package is not suspended // Do not intercept if the package is not suspended if (mAInfo == null || mAInfo.applicationInfo == null || if (!isPackageSuspended()) { (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) { return false; return false; } } final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked(); final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked(); Loading Loading @@ -467,6 +470,17 @@ class ActivityStartInterceptor { return true; return true; } } private boolean isPackageSuspended() { return mAInfo != null && mAInfo.applicationInfo != null && (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) != 0; } private static boolean isKeepProfilesRunningEnabled() { DevicePolicyManagerInternal dpmi = LocalServices.getService(DevicePolicyManagerInternal.class); return dpmi == null || dpmi.isKeepProfilesRunningEnabled(); } /** /** * Called when an activity is successfully launched. * Called when an activity is successfully launched. */ */ Loading services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ open class PackageHelperTestBase { const val UNINSTALLER_PACKAGE = "com.android.test.known.uninstaller" const val UNINSTALLER_PACKAGE = "com.android.test.known.uninstaller" const val VERIFIER_PACKAGE = "com.android.test.known.verifier" const val VERIFIER_PACKAGE = "com.android.test.known.verifier" const val PERMISSION_CONTROLLER_PACKAGE = "com.android.test.known.permission" const val PERMISSION_CONTROLLER_PACKAGE = "com.android.test.known.permission" const val MGMT_ROLE_HOLDER_PACKAGE = "com.android.test.know.device_management" const val TEST_USER_ID = 0 const val TEST_USER_ID = 0 } } Loading Loading @@ -119,6 +120,8 @@ open class PackageHelperTestBase { Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) .getKnownPackageNamesInternal(any(), .getKnownPackageNamesInternal(any(), eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) Mockito.doReturn(MGMT_ROLE_HOLDER_PACKAGE).`when`(pms) .getDevicePolicyManagementRoleHolderPackageName(eq(TEST_USER_ID)) } } private fun createPackageManagerService(vararg stageExistingPackages: String): private fun createPackageManagerService(vararg stageExistingPackages: String): Loading services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +3 −2 Original line number Original line Diff line number Diff line Loading @@ -128,13 +128,14 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_forQuietMode() { fun setPackagesSuspended_forQuietMode() { val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE) PERMISSION_CONTROLLER_PACKAGE, MGMT_ROLE_HOLDER_PACKAGE) val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), knownPackages, true /* suspended */, null /* appExtras */, knownPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */)!! TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */)!! assertThat(failedNames.size).isEqualTo(0) assertThat(failedNames.size).isEqualTo(1) assertThat(failedNames[0]).isEqualTo(MGMT_ROLE_HOLDER_PACKAGE) } } @Test @Test Loading Loading
services/core/java/com/android/server/pm/PackageManagerService.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3409,7 +3409,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } @Nullable @Nullable private String getDevicePolicyManagementRoleHolderPackageName(int userId) { public String getDevicePolicyManagementRoleHolderPackageName(int userId) { return Binder.withCleanCallingIdentity(() -> { return Binder.withCleanCallingIdentity(() -> { RoleManager roleManager = mContext.getSystemService(RoleManager.class); RoleManager roleManager = mContext.getSystemService(RoleManager.class); List<String> roleHolders = List<String> roleHolders = Loading
services/core/java/com/android/server/pm/SuspendPackageHelper.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -724,6 +724,10 @@ public final class SuspendPackageHelper { for (PackageInfo info : pkgInfos) { for (PackageInfo info : pkgInfos) { result.add(info.packageName); result.add(info.packageName); } } // Role holder may be null, but ArraySet handles it correctly. result.remove(mPm.getDevicePolicyManagementRoleHolderPackageName(userId)); return result; return result; } } Loading
services/core/java/com/android/server/wm/ActivityStartInterceptor.java +16 −2 Original line number Original line Diff line number Diff line Loading @@ -280,6 +280,10 @@ class ActivityStartInterceptor { return false; return false; } } if (isKeepProfilesRunningEnabled() && !isPackageSuspended()) { return false; } IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT); FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT); Loading Loading @@ -322,8 +326,7 @@ class ActivityStartInterceptor { private boolean interceptSuspendedPackageIfNeeded() { private boolean interceptSuspendedPackageIfNeeded() { // Do not intercept if the package is not suspended // Do not intercept if the package is not suspended if (mAInfo == null || mAInfo.applicationInfo == null || if (!isPackageSuspended()) { (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) { return false; return false; } } final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked(); final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked(); Loading Loading @@ -467,6 +470,17 @@ class ActivityStartInterceptor { return true; return true; } } private boolean isPackageSuspended() { return mAInfo != null && mAInfo.applicationInfo != null && (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) != 0; } private static boolean isKeepProfilesRunningEnabled() { DevicePolicyManagerInternal dpmi = LocalServices.getService(DevicePolicyManagerInternal.class); return dpmi == null || dpmi.isKeepProfilesRunningEnabled(); } /** /** * Called when an activity is successfully launched. * Called when an activity is successfully launched. */ */ Loading
services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -48,6 +48,7 @@ open class PackageHelperTestBase { const val UNINSTALLER_PACKAGE = "com.android.test.known.uninstaller" const val UNINSTALLER_PACKAGE = "com.android.test.known.uninstaller" const val VERIFIER_PACKAGE = "com.android.test.known.verifier" const val VERIFIER_PACKAGE = "com.android.test.known.verifier" const val PERMISSION_CONTROLLER_PACKAGE = "com.android.test.known.permission" const val PERMISSION_CONTROLLER_PACKAGE = "com.android.test.known.permission" const val MGMT_ROLE_HOLDER_PACKAGE = "com.android.test.know.device_management" const val TEST_USER_ID = 0 const val TEST_USER_ID = 0 } } Loading Loading @@ -119,6 +120,8 @@ open class PackageHelperTestBase { Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) .getKnownPackageNamesInternal(any(), .getKnownPackageNamesInternal(any(), eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) eq(KnownPackages.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) Mockito.doReturn(MGMT_ROLE_HOLDER_PACKAGE).`when`(pms) .getDevicePolicyManagementRoleHolderPackageName(eq(TEST_USER_ID)) } } private fun createPackageManagerService(vararg stageExistingPackages: String): private fun createPackageManagerService(vararg stageExistingPackages: String): Loading
services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +3 −2 Original line number Original line Diff line number Diff line Loading @@ -128,13 +128,14 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_forQuietMode() { fun setPackagesSuspended_forQuietMode() { val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE) PERMISSION_CONTROLLER_PACKAGE, MGMT_ROLE_HOLDER_PACKAGE) val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), knownPackages, true /* suspended */, null /* appExtras */, knownPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */)!! TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */)!! assertThat(failedNames.size).isEqualTo(0) assertThat(failedNames.size).isEqualTo(1) assertThat(failedNames[0]).isEqualTo(MGMT_ROLE_HOLDER_PACKAGE) } } @Test @Test Loading