diff options
7 files changed, 191 insertions, 61 deletions
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 81de29c4ee4d..b241bd16d3ee 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -988,4 +988,14 @@ public abstract class PackageManagerInternal { * Unblocks uninstall for all packages for the user. */ public abstract void clearBlockUninstallForUser(@UserIdInt int userId); + + /** + * Unsuspends all packages suspended by the given package for the user. + */ + public abstract void unsuspendForSuspendingPackage(String suspendingPackage, int userId); + + /** + * Returns {@code true} if the package is suspending any packages for the user. + */ + public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 576e12e289f0..ae8b3a0e9acc 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -13518,6 +13518,17 @@ public class PackageManagerService extends IPackageManager.Stub removeSuspensionsBySuspendingPackage(allPackages, suspendingPackage::equals, userId); } + boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { + synchronized (mLock) { + for (final PackageSetting ps : mSettings.mPackages.values()) { + if (ps.isSuspendedBy(suspendingPackage, userId)) { + return true; + } + } + } + return false; + } + /** * Removes any suspensions on given packages that were added by packages that pass the given * predicate. @@ -23913,7 +23924,6 @@ public class PackageManagerService extends IPackageManager.Stub callingUid); } - @Override public boolean isPlatformSigned(String packageName) { PackageSetting packageSetting = mSettings.mPackages.get(packageName); @@ -25018,6 +25028,16 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.writePackageRestrictionsLPr(userId); } } + + @Override + public void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { + PackageManagerService.this.unsuspendForSuspendingPackage(packageName, affectedUser); + } + + @Override + public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { + return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId); + } } @GuardedBy("mLock") diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index 00a5fe766593..834303cc14c6 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -422,6 +422,11 @@ public abstract class PackageSettingBase extends SettingBase { return readUserState(userId).suspended; } + boolean isSuspendedBy(String suspendingPackage, int userId) { + final PackageUserState state = readUserState(userId); + return state.suspendParams != null && state.suspendParams.containsKey(suspendingPackage); + } + void addOrUpdateSuspension(String suspendingPackage, SuspendDialogInfo dialogInfo, PersistableBundle appExtras, PersistableBundle launcherExtras, int userId) { final PackageUserState existingUserState = modifyUserState(userId); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index df55b3bbd1a4..10ad07cff847 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2755,7 +2755,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Slog.i(LOG_TAG, "Giving the PO additional power..."); markProfileOwnerOnOrganizationOwnedDeviceUncheckedLocked(poAdminComponent, poUserId); Slog.i(LOG_TAG, "Migrating DO policies to PO..."); - moveDoPoliciesToProfileParentAdmin(doAdmin, poAdmin.getParentActiveAdmin()); + moveDoPoliciesToProfileParentAdminLocked(doAdmin, poAdmin.getParentActiveAdmin()); + migratePersonalAppSuspensionLocked(doUserId, poUserId, poAdmin); saveSettingsLocked(poUserId); Slog.i(LOG_TAG, "Clearing the DO..."); final ComponentName doAdminReceiver = doAdmin.info.getComponent(); @@ -2775,6 +2776,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { .write(); } + @GuardedBy("getLockObject()") + private void migratePersonalAppSuspensionLocked( + int doUserId, int poUserId, ActiveAdmin poAdmin) { + final PackageManagerInternal pmi = mInjector.getPackageManagerInternal(); + if (!pmi.isSuspendingAnyPackages(PLATFORM_PACKAGE_NAME, doUserId)) { + Slog.i(LOG_TAG, "DO is not suspending any apps."); + return; + } + + if (getTargetSdk(poAdmin.info.getPackageName(), poUserId) >= Build.VERSION_CODES.R) { + Slog.i(LOG_TAG, "PO is targeting R+, keeping personal apps suspended."); + getUserData(doUserId).mAppsSuspended = true; + poAdmin.mSuspendPersonalApps = true; + } else { + Slog.i(LOG_TAG, "PO isn't targeting R+, unsuspending personal apps."); + pmi.unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, doUserId); + } + } + private void uninstallOrDisablePackage(String packageName, int userHandle) { final ApplicationInfo appInfo; try { @@ -2816,7 +2836,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { pi.uninstall(packageName, 0 /* flags */, new IntentSender((IIntentSender) mLocalSender)); } - private void moveDoPoliciesToProfileParentAdmin(ActiveAdmin doAdmin, ActiveAdmin parentAdmin) { + @GuardedBy("getLockObject()") + private void moveDoPoliciesToProfileParentAdminLocked( + ActiveAdmin doAdmin, ActiveAdmin parentAdmin) { // The following policies can be already controlled via parent instance, skip if so. if (parentAdmin.mPasswordPolicy.quality == PASSWORD_QUALITY_UNSPECIFIED) { parentAdmin.mPasswordPolicy = doAdmin.mPasswordPolicy; @@ -16147,25 +16169,34 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } Slog.i(LOG_TAG, String.format("%s personal apps for user %d", suspended ? "Suspending" : "Unsuspending", userId)); + + if (suspended) { + suspendPersonalAppsInPackageManager(userId); + } else { + mInjector.getPackageManagerInternal().unsuspendForSuspendingPackage( + PLATFORM_PACKAGE_NAME, userId); + } + + synchronized (getLockObject()) { + getUserData(userId).mAppsSuspended = suspended; + saveSettingsLocked(userId); + } + } + + private void suspendPersonalAppsInPackageManager(int userId) { mInjector.binderWithCleanCallingIdentity(() -> { try { final String[] appsToSuspend = mInjector.getPersonalAppsForSuspension(userId); - final String[] failedPackages = mIPackageManager.setPackagesSuspendedAsUser( - appsToSuspend, suspended, null, null, null, PLATFORM_PACKAGE_NAME, userId); - if (!ArrayUtils.isEmpty(failedPackages)) { - Slog.wtf(LOG_TAG, String.format("Failed to %s packages: %s", - suspended ? "suspend" : "unsuspend", String.join(",", failedPackages))); + final String[] failedApps = mIPackageManager.setPackagesSuspendedAsUser( + appsToSuspend, true, null, null, null, PLATFORM_PACKAGE_NAME, userId); + if (!ArrayUtils.isEmpty(failedApps)) { + Slog.wtf(LOG_TAG, "Failed to suspend apps: " + String.join(",", failedApps)); } } catch (RemoteException re) { // Shouldn't happen. Slog.e(LOG_TAG, "Failed talking to the package manager", re); } }); - - synchronized (getLockObject()) { - getUserData(userId).mAppsSuspended = suspended; - saveSettingsLocked(userId); - } } @GuardedBy("getLockObject()") diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java index a0b9d9d2a875..3167820f0a48 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java @@ -18,17 +18,24 @@ package com.android.server.devicepolicy; import static android.os.UserHandle.USER_SYSTEM; import static com.android.server.devicepolicy.DpmTestUtils.writeInputStreamToFile; +import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static org.junit.Assert.assertArrayEquals; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManagerInternal; import android.content.ComponentName; +import android.content.Intent; import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -354,8 +361,7 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { prepareAdmin1AsDo(); prepareAdminAnotherPackageAsPo(COPE_PROFILE_USER_ID); - final DevicePolicyManagerServiceTestable dpms; - dpms = bootDpmsUp(); + final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); // DO should still be DO since no migration should happen. assertTrue(dpms.mOwners.hasDeviceOwner()); @@ -364,13 +370,12 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { @SmallTest public void testCompMigrationAffiliated() throws Exception { prepareAdmin1AsDo(); - prepareAdmin1AsPo(COPE_PROFILE_USER_ID); + prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.R); // Secure lock screen is needed for password policy APIs to work. when(getServices().lockPatternUtils.hasSecureLockScreen()).thenReturn(true); - final DevicePolicyManagerServiceTestable dpms; - dpms = bootDpmsUp(); + final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); // DO should cease to be DO. assertFalse(dpms.mOwners.hasDeviceOwner()); @@ -408,6 +413,66 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { dpms.getProfileOwnerAdminLocked(COPE_PROFILE_USER_ID) .getEffectiveRestrictions() .containsKey(UserManager.DISALLOW_CONFIG_DATE_TIME)); + assertEquals("Personal apps suspension wasn't migrated", + DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED, + dpm.getPersonalAppsSuspendedReasons(admin1)); + }); + } + + @SmallTest + public void testCompMigration_keepSuspendedAppsWhenDpcIsRPlus() throws Exception { + prepareAdmin1AsDo(); + prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.R); + + // Pretend some packages are suspended. + when(getServices().packageManagerInternal.isSuspendingAnyPackages( + PLATFORM_PACKAGE_NAME, USER_SYSTEM)).thenReturn(true); + + final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); + + verify(getServices().packageManagerInternal, never()) + .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + + sendBroadcastWithUser(dpms, Intent.ACTION_USER_STARTED, USER_SYSTEM); + + // Verify that actual package suspension state is not modified after user start + verify(getServices().packageManagerInternal, never()) + .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + verify(getServices().ipackageManager, never()).setPackagesSuspendedAsUser( + any(), anyBoolean(), any(), any(), any(), any(), anyInt()); + + final DpmMockContext poContext = new DpmMockContext(getServices(), mRealTestContext); + poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID); + + runAsCaller(poContext, dpms, dpm -> { + assertEquals("Personal apps suspension wasn't migrated", + DevicePolicyManager.PERSONAL_APPS_SUSPENDED_EXPLICITLY, + dpm.getPersonalAppsSuspendedReasons(admin1)); + }); + } + + @SmallTest + public void testCompMigration_unsuspendAppsWhenDpcNotRPlus() throws Exception { + prepareAdmin1AsDo(); + prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.Q); + + // Pretend some packages are suspended. + when(getServices().packageManagerInternal.isSuspendingAnyPackages( + PLATFORM_PACKAGE_NAME, USER_SYSTEM)).thenReturn(true); + + final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); + + // Verify that apps get unsuspended. + verify(getServices().packageManagerInternal) + .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + + final DpmMockContext poContext = new DpmMockContext(getServices(), mRealTestContext); + poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID); + + runAsCaller(poContext, dpms, dpm -> { + assertEquals("Personal apps weren't unsuspended", + DevicePolicyManager.PERSONAL_APPS_NOT_SUSPENDED, + dpm.getPersonalAppsSuspendedReasons(admin1)); }); } @@ -439,22 +504,23 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { .getAbsoluteFile()); } - private void prepareAdmin1AsPo(int profileUserId) throws Exception { + private void prepareAdmin1AsPo(int profileUserId, int targetSdk) throws Exception { preparePo(profileUserId, admin1, R.raw.comp_profile_owner_same_package, - R.raw.comp_policies_profile_same_package, COPE_ADMIN1_APP_ID); + R.raw.comp_policies_profile_same_package, COPE_ADMIN1_APP_ID, targetSdk); } private void prepareAdminAnotherPackageAsPo(int profileUserId) throws Exception { preparePo(profileUserId, adminAnotherPackage, R.raw.comp_profile_owner_another_package, - R.raw.comp_policies_profile_another_package, COPE_ANOTHER_ADMIN_APP_ID); + R.raw.comp_policies_profile_another_package, COPE_ANOTHER_ADMIN_APP_ID, + Build.VERSION.SDK_INT); } private void preparePo(int profileUserId, ComponentName admin, int profileOwnerXmlResId, - int policyXmlResId, int adminAppId) throws Exception { + int policyXmlResId, int adminAppId, int targetSdk) throws Exception { final File profileDir = getServices().addUser(profileUserId, 0, UserManager.USER_TYPE_PROFILE_MANAGED, USER_SYSTEM /* profile group */); - setUpPackageManagerForFakeAdmin( - admin, UserHandle.getUid(profileUserId, adminAppId), admin1); + setUpPackageManagerForFakeAdmin(admin, UserHandle.getUid(profileUserId, adminAppId), + /* enabledSetting =*/ null, targetSdk, admin1); writeInputStreamToFile(getRawStream(policyXmlResId), (new File(profileDir, "device_policies.xml")).getAbsoluteFile()); writeInputStreamToFile(getRawStream(profileOwnerXmlResId), diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 4a774898e1b5..daaabf8141ff 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -254,7 +254,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { @Override protected void tearDown() throws Exception { - flushTasks(); + flushTasks(dpms); getMockTransferMetadataManager().deleteMetadataFile(); super.tearDown(); } @@ -4961,7 +4961,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // CertificateMonitor.updateInstalledCertificates is called on the background thread, // let it finish with system uid, otherwise it will throw and crash. - flushTasks(); + flushTasks(dpms); mContext.binder.restoreCallingIdentity(ident); } @@ -5459,7 +5459,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED) .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()), callerUser.getIdentifier()); - flushTasks(); + flushTasks(dpms); final List<String> ownerInstalledCaCerts = new ArrayList<>(); @@ -5486,7 +5486,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED) .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()), callerUser.getIdentifier()); - flushTasks(); + flushTasks(dpms); // Verify that the CA cert is no longer reported as installed by the Device Owner / Profile // Owner. @@ -5530,7 +5530,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED) .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()), callerUser.getIdentifier()); - flushTasks(); + flushTasks(dpms); // Removing the Profile Owner should clear the information on which CA certs were installed runAsCaller(admin1Context, dpms, dpm -> dpm.clearProfileOwner(admin1)); @@ -6311,7 +6311,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { clearInvocations(getServices().alarmManager); setUserUnlocked(CALLER_USER_HANDLE, false); - sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Verify the alarm was scheduled for time when the warning should be shown. verify(getServices().alarmManager, times(1)) @@ -6325,7 +6325,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10); - sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); // Verify the alarm was scheduled for the actual deadline this time. verify(getServices().alarmManager, times(1)).set(anyInt(), eq(PROFILE_OFF_DEADLINE), any()); @@ -6340,7 +6340,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10); - sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); // Verify the alarm was not set. verifyZeroInteractions(getServices().alarmManager); @@ -6364,10 +6364,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; setUserUnlocked(CALLER_USER_HANDLE, false); - sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); setUserUnlocked(CALLER_USER_HANDLE, true); - sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the alarm got discharged. verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null); @@ -6384,16 +6384,16 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; setUserUnlocked(CALLER_USER_HANDLE, false); - sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Pretend the alarm went off. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_WARNING_TIME + 10); - sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); clearInvocations(getServices().notificationManager); setUserUnlocked(CALLER_USER_HANDLE, true); - sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the alarm got discharged. verify(getServices().alarmManager, times(1)).cancel((PendingIntent) null); @@ -6413,24 +6413,24 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; setUserUnlocked(CALLER_USER_HANDLE, false); - sendBroadcastWithUser(Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_STOPPED, CALLER_USER_HANDLE); // Pretend the alarm went off after the deadline. dpms.mMockInjector.setSystemCurrentTimeMillis(PROFILE_OFF_DEADLINE + 10); - sendBroadcastWithUser(ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, ACTION_PROFILE_OFF_DEADLINE, CALLER_USER_HANDLE); clearInvocations(getServices().alarmManager); clearInvocations(getServices().notificationManager); clearInvocations(getServices().ipackageManager); // Pretend the user clicked on the "apps suspended" notification to turn the profile on. - sendBroadcastWithUser(ACTION_TURN_PROFILE_ON_NOTIFICATION, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, ACTION_TURN_PROFILE_ON_NOTIFICATION, CALLER_USER_HANDLE); // Verify that the profile is turned on. verify(getServices().userManager, times(1)) .requestQuietModeEnabled(eq(false), eq(UserHandle.of(CALLER_USER_HANDLE))); setUserUnlocked(CALLER_USER_HANDLE, true); - sendBroadcastWithUser(Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); + sendBroadcastWithUser(dpms, Intent.ACTION_USER_UNLOCKED, CALLER_USER_HANDLE); // Verify that the notification is removed (at this point DPC should show it). verify(getServices().notificationManager, times(1)) @@ -6454,13 +6454,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { .isEqualTo(DevicePolicyManager.PERSONAL_APPS_SUSPENDED_PROFILE_TIMEOUT); } - private void sendBroadcastWithUser(String action, int userHandle) throws Exception { - final Intent intent = new Intent(action); - intent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); - getServices().injectBroadcast(mServiceContext, intent, userHandle); - flushTasks(); - } - private void setUserUnlocked(int userHandle, boolean unlocked) { when(getServices().userManager.isUserUnlocked(eq(userHandle))).thenReturn(unlocked); } @@ -6471,10 +6464,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { when(getServices().userManager.isUserUnlocked()).thenReturn(true); - // Pretend our admin handles CHECK_POLICY_COMPLIANCE intent. - final Intent intent = new Intent(ACTION_CHECK_POLICY_COMPLIANCE); - intent.setPackage(admin1.getPackageName()); - doReturn(Collections.singletonList(new ResolveInfo())) .when(getServices().packageManager).queryIntentActivitiesAsUser( any(Intent.class), anyInt(), eq(CALLER_USER_HANDLE)); @@ -6674,12 +6663,4 @@ public class DevicePolicyManagerTest extends DpmTestBase { return new StringParceledListSlice(Arrays.asList(s)); } - private void flushTasks() throws Exception { - dpms.mHandler.runWithScissors(() -> {}, 0 /*now*/); - dpms.mBackgroundHandler.runWithScissors(() -> {}, 0 /*now*/); - - // We can't let exceptions happen on the background thread. Throw them here if they happen - // so they still cause the test to fail despite being suppressed. - getServices().rethrowBackgroundBroadcastExceptions(); - } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java index 9a1a5fbfd186..41d54e9010d3 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmTestBase.java @@ -83,6 +83,23 @@ public abstract class DpmTestBase extends AndroidTestCase { return mServices; } + protected void sendBroadcastWithUser(DevicePolicyManagerServiceTestable dpms, String action, + int userHandle) throws Exception { + final Intent intent = new Intent(action); + intent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle); + getServices().injectBroadcast(getContext(), intent, userHandle); + flushTasks(dpms); + } + + protected void flushTasks(DevicePolicyManagerServiceTestable dpms) throws Exception { + dpms.mHandler.runWithScissors(() -> { }, 0 /*now*/); + dpms.mBackgroundHandler.runWithScissors(() -> { }, 0 /*now*/); + + // We can't let exceptions happen on the background thread. Throw them here if they happen + // so they still cause the test to fail despite being suppressed. + getServices().rethrowBackgroundBroadcastExceptions(); + } + protected interface DpmRunnable { void run(DevicePolicyManager dpm) throws Exception; } @@ -180,7 +197,7 @@ public abstract class DpmTestBase extends AndroidTestCase { * @param copyFromAdmin package information for {@code admin} will be built based on this * component's information. */ - private void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, + protected void setUpPackageManagerForFakeAdmin(ComponentName admin, int packageUid, Integer enabledSetting, Integer appTargetSdk, ComponentName copyFromAdmin) throws Exception { |