diff options
16 files changed, 77 insertions, 344 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 258ff312259c..0ab3f80dd088 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -575,7 +575,6 @@ package android.app.admin { method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public boolean setDeviceOwnerOnly(@NonNull android.content.ComponentName, int); method public void setDeviceOwnerType(@NonNull android.content.ComponentName, int); method @RequiresPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS) public void setNextOperationSafety(int, int); - method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setOverrideKeepProfilesRunning(boolean); method @RequiresPermission(anyOf={android.Manifest.permission.MARK_DEVICE_ORGANIZATION_OWNED, android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS}, conditional=true) public void setProfileOwnerOnOrganizationOwnedDevice(@NonNull android.content.ComponentName, boolean); method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public boolean triggerDevicePolicyEngineMigration(boolean); field public static final String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED"; diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index a46c1006d314..4c70c914ff21 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -17048,23 +17048,6 @@ public class DevicePolicyManager { } /** - * Overrides the effective cached value of enable_keep_profiles_running for testing purposes. - * - * @hide - */ - @TestApi - @RequiresPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) - public void setOverrideKeepProfilesRunning(boolean enabled) { - if (mService != null) { - try { - mService.setOverrideKeepProfilesRunning(enabled); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - } - - /** * Triggers the data migration of device policies for existing DPCs to the Device Policy Engine. * If {@code forceMigration} is set to {@code true} it skips the prerequisite checks before * triggering the migration. diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index 8dd50f0c42e8..304359bc6105 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -312,21 +312,11 @@ public abstract class DevicePolicyManagerInternal { int targetUserId); /** - * Returns whether new "turn off work" behavior is enabled via feature flag. - */ - public abstract boolean isKeepProfilesRunningEnabled(); - - /** * True if either the entire device or the user is organization managed. */ public abstract boolean isUserOrganizationManaged(@UserIdInt int userId); /** - * Returns the list of packages suspended by admin on a given user. - */ - public abstract Set<String> getPackagesSuspendedByAdmin(@UserIdInt int userId); - - /** * Returns whether the application exemptions feature flag is enabled. */ public abstract boolean isApplicationExemptionsFlagEnabled(); diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 58f9d57763fa..6fe40be041cc 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -603,8 +603,6 @@ interface IDevicePolicyManager { DevicePolicyState getDevicePolicyState(); - void setOverrideKeepProfilesRunning(boolean enabled); - boolean triggerDevicePolicyEngineMigration(boolean forceMigration); boolean isDeviceFinanced(String callerPackageName); diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 638abdba36ec..4f322203192f 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -300,14 +300,6 @@ public abstract class PackageManagerInternal { @UserIdInt int userId, @NonNull String[] packageNames, boolean suspended); /** - * Suspend or unsuspend packages in a profile when quiet mode is toggled. - * - * @param userId The target user. - * @param suspended Whether the packages should be suspended or unsuspended. - */ - public abstract void setPackagesSuspendedForQuietMode(@UserIdInt int userId, boolean suspended); - - /** * Get the information describing the dialog to be shown to the user when they try to launch a * suspended application. * diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index ae62a7a59709..87633e9e255d 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -76,7 +76,6 @@ import android.app.BroadcastOptions; import android.app.IStopUserCallback; import android.app.IUserSwitchObserver; import android.app.KeyguardManager; -import android.app.admin.DevicePolicyManagerInternal; import android.app.usage.UsageEvents; import android.appwidget.AppWidgetManagerInternal; import android.content.Context; @@ -1497,10 +1496,8 @@ class UserController implements Handler.Callback { private boolean shouldStartWithParent(UserInfo user) { final UserProperties properties = getUserProperties(user.id); - DevicePolicyManagerInternal dpmi = - LocalServices.getService(DevicePolicyManagerInternal.class); return (properties != null && properties.getStartWithParent()) - && (!user.isQuietModeEnabled() || dpmi.isKeepProfilesRunningEnabled()); + && !user.isQuietModeEnabled(); } /** diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index b2f00a246c23..1bdd402cf0b5 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -128,12 +128,12 @@ import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.server.am.PendingIntentRecord.FLAG_ACTIVITY_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_BROADCAST_SENDER; import static com.android.server.am.PendingIntentRecord.FLAG_SERVICE_SENDER; +import static com.android.server.notification.Flags.expireBitmaps; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_ANIM_BUFFER; import static com.android.server.policy.PhoneWindowManager.TOAST_WINDOW_TIMEOUT; import static com.android.server.utils.PriorityDump.PRIORITY_ARG; import static com.android.server.utils.PriorityDump.PRIORITY_ARG_CRITICAL; import static com.android.server.utils.PriorityDump.PRIORITY_ARG_NORMAL; -import static com.android.server.notification.Flags.expireBitmaps; import android.Manifest; import android.Manifest.permission; @@ -178,7 +178,6 @@ import android.app.compat.CompatChanges; import android.app.role.OnRoleHoldersChangedListener; import android.app.role.RoleManager; import android.app.usage.UsageEvents; -import android.app.usage.UsageStatsManager; import android.app.usage.UsageStatsManagerInternal; import android.companion.ICompanionDeviceManager; import android.compat.annotation.ChangeId; @@ -206,8 +205,6 @@ import android.content.pm.UserInfo; import android.content.pm.VersionedPackage; import android.content.res.Resources; import android.database.ContentObserver; -import android.graphics.Bitmap; -import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManagerInternal; @@ -320,7 +317,6 @@ import com.android.server.SystemService; import com.android.server.job.JobSchedulerInternal; import com.android.server.lights.LightsManager; import com.android.server.lights.LogicalLight; -import com.android.server.notification.Flags; import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.notification.ManagedServices.UserProfiles; import com.android.server.notification.toast.CustomToastRecord; @@ -1935,7 +1931,7 @@ public class NotificationManagerService extends SystemService { } else if ( isProfileUnavailable(action)) { int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); - if (userHandle >= 0 && !mDpm.isKeepProfilesRunningEnabled()) { + if (userHandle >= 0) { cancelAllNotificationsInt(MY_UID, MY_PID, null, null, 0, 0, userHandle, REASON_PROFILE_TURNED_OFF); mSnoozeHelper.clearData(userHandle); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 638bcbe5822c..d180b982be75 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2085,8 +2085,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mUserNeedsBadging, () -> mResolveInfo, () -> mInstantAppInstallerActivity, injector.getBackgroundHandler()); mDexOptHelper = new DexOptHelper(this); - mSuspendPackageHelper = new SuspendPackageHelper(this, mInjector, mUserManager, - mBroadcastHelper, mProtectedPackages); + mSuspendPackageHelper = new SuspendPackageHelper(this, mInjector, mBroadcastHelper, + mProtectedPackages); mDistractingPackageHelper = new DistractingPackageHelper(this, mBroadcastHelper, mSuspendPackageHelper); mStorageEventHelper = new StorageEventHelper(this, mDeletePackageHelper, @@ -6145,7 +6145,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended, appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid, - false /* forQuietMode */, quarantined); + quarantined); } @Override @@ -6602,12 +6602,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void setPackagesSuspendedForQuietMode(int userId, boolean suspended) { - mSuspendPackageHelper.setPackagesSuspendedForQuietMode( - snapshotComputer(), userId, suspended); - } - - @Override public void setDeviceAndProfileOwnerPackages( int deviceOwnerUserId, String deviceOwnerPackage, SparseArray<String> profileOwnerPackages) { diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index e8cebefb8631..71f6c0d507d4 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -16,8 +16,6 @@ package com.android.server.pm; -import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; -import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.os.Process.SYSTEM_UID; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; @@ -27,9 +25,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.AppOpsManager; -import android.app.admin.DevicePolicyManagerInternal; import android.content.Intent; -import android.content.pm.PackageInfo; import android.content.pm.SuspendDialogInfo; import android.os.Binder; import android.os.Bundle; @@ -45,7 +41,6 @@ import android.util.Slog; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; -import com.android.server.LocalServices; import com.android.server.pm.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserStateInternal; @@ -54,10 +49,8 @@ import com.android.server.pm.pkg.mutate.PackageUserStateWrite; import com.android.server.utils.WatchedArrayMap; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.function.Predicate; public final class SuspendPackageHelper { @@ -68,7 +61,6 @@ public final class SuspendPackageHelper { private final PackageManagerService mPm; private final PackageManagerServiceInjector mInjector; - private final UserManagerService mUserManager; private final BroadcastHelper mBroadcastHelper; private final ProtectedPackages mProtectedPackages; @@ -76,10 +68,8 @@ public final class SuspendPackageHelper { * Constructor for {@link PackageManagerService}. */ SuspendPackageHelper(PackageManagerService pm, PackageManagerServiceInjector injector, - UserManagerService userManager, BroadcastHelper broadcastHelper, - ProtectedPackages protectedPackages) { + BroadcastHelper broadcastHelper, ProtectedPackages protectedPackages) { mPm = pm; - mUserManager = userManager; mInjector = injector; mBroadcastHelper = broadcastHelper; mProtectedPackages = protectedPackages; @@ -102,7 +92,6 @@ public final class SuspendPackageHelper { * @param callingPackage The caller's package name. * @param userId The user where packages reside. * @param callingUid The caller's uid. - * @param forQuietMode Whether suspension is for quiet mode, in which case no apps are exempt. * @return The names of failed packages. */ @Nullable @@ -110,11 +99,11 @@ public final class SuspendPackageHelper { boolean suspended, @Nullable PersistableBundle appExtras, @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo, @NonNull String callingPackage, @UserIdInt int userId, int callingUid, - boolean forQuietMode, boolean quarantined) { + boolean quarantined) { if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } - if (suspended && !quarantined && !forQuietMode && !isSuspendAllowedForUser(snapshot, userId, + if (suspended && !quarantined && !isSuspendAllowedForUser(snapshot, userId, callingUid)) { Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); return packageNames; @@ -130,7 +119,7 @@ public final class SuspendPackageHelper { final ArraySet<String> changedPackagesList = new ArraySet<>(packageNames.length); final IntArray changedUids = new IntArray(packageNames.length); - final boolean[] canSuspend = suspended && !forQuietMode + final boolean[] canSuspend = suspended ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { @@ -620,92 +609,10 @@ public final class SuspendPackageHelper { */ public String[] setPackagesSuspendedByAdmin( Computer snapshot, int userId, String[] packageNames, boolean suspend) { - final Set<String> toSuspend = new ArraySet<>(packageNames); - List<String> unsuspendable = new ArrayList<>(); - - if (mUserManager.isQuietModeEnabled(userId)) { - // If the user is in quiet mode, most apps will already be suspended, we shouldn't - // re-suspend or unsuspend them. - final Set<String> quiet = packagesToSuspendInQuietMode(snapshot, userId); - quiet.retainAll(toSuspend); - if (!quiet.isEmpty()) { - Slog.i(TAG, "Ignoring quiet packages: " + String.join(", ", quiet)); - toSuspend.removeAll(quiet); - } - - // Some of the already suspended packages might not be suspendable by the admin - // (e.g. current dialer package), we need to report it back as unsuspendable the same - // way as if quiet mode wasn't enabled. In that latter case they'd be returned by - // setPackagesSuspended below after unsuccessful attempt to suspend them. - if (suspend) { - unsuspendable = getUnsuspendablePackages(snapshot, userId, quiet); - } - } - if (!toSuspend.isEmpty()) { - unsuspendable.addAll(Arrays.asList( - setPackagesSuspended( - snapshot, toSuspend.toArray(new String[0]), suspend, - null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, - PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID, - false /* forQuietMode */, false /* quarantined */))); - } - return unsuspendable.toArray(String[]::new); - } - - private List<String> getUnsuspendablePackages( - Computer snapshot, int userId, Set<String> packages) { - final String[] toSuspendArray = packages.toArray(String[]::new); - final boolean[] mask = - canSuspendPackageForUser(snapshot, toSuspendArray, userId, Process.SYSTEM_UID); - final List<String> result = new ArrayList<>(); - for (int i = 0; i < mask.length; i++) { - if (!mask[i]) { - result.add(toSuspendArray[i]); - } - } - return result; - } - - /** - * Suspends or unsuspends all packages in the given user when quiet mode is toggled to prevent - * usage while quiet mode is enabled. - */ - public void setPackagesSuspendedForQuietMode( - Computer snapshot, int userId, boolean suspend) { - final Set<String> toSuspend = packagesToSuspendInQuietMode(snapshot, userId); - if (!suspend) { - final DevicePolicyManagerInternal dpm = - LocalServices.getService(DevicePolicyManagerInternal.class); - if (dpm != null) { - toSuspend.removeAll(dpm.getPackagesSuspendedByAdmin(userId)); - } else { - Slog.wtf(TAG, - "DevicePolicyManager unavailable while suspending apps for quiet mode"); - } - } - - if (toSuspend.isEmpty()) { - return; - } - - setPackagesSuspended(snapshot, toSuspend.toArray(new String[0]), - suspend, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, + return setPackagesSuspended(snapshot, packageNames, suspend, + null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID, - true /* forQuietMode */, false /* quarantined */); - } - - private Set<String> packagesToSuspendInQuietMode(Computer snapshot, int userId) { - final List<PackageInfo> pkgInfos = snapshot.getInstalledPackages( - MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userId).getList(); - final Set<String> result = new ArraySet<>(); - for (PackageInfo info : pkgInfos) { - result.add(info.packageName); - } - - // Role holder may be null, but ArraySet handles it correctly. - result.remove(mPm.getDevicePolicyManagementRoleHolderPackageName(userId)); - - return result; + false /* quarantined */); } private String getKnownPackageName(@NonNull Computer snapshot, diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index c97fbdad9bf4..81a570f0e7a5 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -46,7 +46,6 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; -import android.app.AppOpsManager; import android.app.BroadcastOptions; import android.app.IActivityManager; import android.app.IStopUserCallback; @@ -55,7 +54,6 @@ import android.app.PendingIntent; import android.app.StatsManager; import android.app.admin.DevicePolicyEventLogger; import android.app.admin.DevicePolicyManagerInternal; -import android.app.trust.TrustManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IIntentReceiver; @@ -302,19 +300,6 @@ public class UserManagerService extends IUserManager.Stub { private static final String TRON_USER_CREATED = "users_user_created"; private static final String TRON_DEMO_CREATED = "users_demo_created"; - // App ops that should be restricted in quiet mode - private static final int[] QUIET_MODE_RESTRICTED_APP_OPS = { - AppOpsManager.OP_COARSE_LOCATION, - AppOpsManager.OP_FINE_LOCATION, - AppOpsManager.OP_GPS, - AppOpsManager.OP_BODY_SENSORS, - AppOpsManager.OP_ACTIVITY_RECOGNITION, - AppOpsManager.OP_BLUETOOTH_SCAN, - AppOpsManager.OP_NEARBY_WIFI_DEVICES, - AppOpsManager.OP_RECORD_AUDIO, - AppOpsManager.OP_CAMERA, - }; - private final Context mContext; private final PackageManagerService mPm; @@ -339,7 +324,6 @@ public class UserManagerService extends IUserManager.Stub { private final File mUserListFile; private final IBinder mUserRestrictionToken = new Binder(); - private final IBinder mQuietModeToken = new Binder(); /** Installs system packages based on user-type. */ private final UserSystemPackageInstaller mSystemPackageInstaller; @@ -702,7 +686,6 @@ public class UserManagerService extends IUserManager.Stub { @Override public void onUserStarting(@NonNull TargetUser targetUser) { - boolean isProfileInQuietMode = false; synchronized (mUms.mUsersLock) { final UserData user = mUms.getUserDataLU(targetUser.getUserIdentifier()); if (user != null) { @@ -710,14 +693,9 @@ public class UserManagerService extends IUserManager.Stub { if (targetUser.getUserIdentifier() == UserHandle.USER_SYSTEM && targetUser.isFull()) { mUms.setLastEnteredForegroundTimeToNow(user); - } else if (user.info.isManagedProfile() && user.info.isQuietModeEnabled()) { - isProfileInQuietMode = true; } } } - if (isProfileInQuietMode) { - mUms.setAppOpsRestrictedForQuietMode(targetUser.getUserIdentifier(), true); - } } @Override @@ -1516,43 +1494,21 @@ public class UserManagerService extends IUserManager.Stub { synchronized (mPackagesLock) { writeUserLP(profileUserData); } - if (getDevicePolicyManagerInternal().isKeepProfilesRunningEnabled()) { - // New behavior: when quiet mode is enabled, profile user is running, but apps are - // suspended. - getPackageManagerInternal().setPackagesSuspendedForQuietMode(userId, enableQuietMode); - setAppOpsRestrictedForQuietMode(userId, enableQuietMode); - if (enableQuietMode - && !mLockPatternUtils.isManagedProfileWithUnifiedChallenge(userId)) { - mContext.getSystemService(TrustManager.class).setDeviceLockedForUser(userId, true); - } - - if (!enableQuietMode && target != null) { - try { - mContext.startIntentSender(target, null, 0, 0, 0); - } catch (IntentSender.SendIntentException e) { - Slog.e(LOG_TAG, "Failed to start intent after disabling quiet mode", e); - } - } - } else { - // Old behavior: when quiet is enabled, profile user is stopped. - // Old quiet mode behavior: profile user is stopped. - // TODO(b/265683382) Remove once rollout complete. - try { - if (enableQuietMode) { - ActivityManager.getService().stopUser(userId, /* force= */ true, null); - LocalServices.getService(ActivityManagerInternal.class) - .killForegroundAppsForUser(userId); - } else { - IProgressListener callback = target != null - ? new DisableQuietModeUserUnlockedCallback(target) - : null; - ActivityManager.getService().startProfileWithListener(userId, callback); - } - } catch (RemoteException e) { - // Should not happen, same process. - e.rethrowAsRuntimeException(); + try { + if (enableQuietMode) { + ActivityManager.getService().stopUser(userId, /* force= */ true, null); + LocalServices.getService(ActivityManagerInternal.class) + .killForegroundAppsForUser(userId); + } else { + IProgressListener callback = target != null + ? new DisableQuietModeUserUnlockedCallback(target) + : null; + ActivityManager.getService().startProfileWithListener(userId, callback); } + } catch (RemoteException e) { + // Should not happen, same process. + e.rethrowAsRuntimeException(); } logQuietModeEnabled(userId, enableQuietMode, callingPackage); @@ -1569,17 +1525,6 @@ public class UserManagerService extends IUserManager.Stub { } } - private void setAppOpsRestrictedForQuietMode(@UserIdInt int userId, boolean restrict) { - for (int opCode : QUIET_MODE_RESTRICTED_APP_OPS) { - try { - mAppOpsService.setUserRestriction( - opCode, restrict, mQuietModeToken, userId, /* excludedPackageTags= */ null); - } catch (RemoteException e) { - Slog.w(LOG_TAG, "Unable to limit app ops", e); - } - } - } - private void logQuietModeEnabled(@UserIdInt int userId, boolean enableQuietMode, @Nullable String callingPackage) { Slogf.i(LOG_TAG, diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index 25c42b4858a4..f9d344bd7e31 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -285,10 +285,6 @@ class ActivityStartInterceptor { return false; } - if (isKeepProfilesRunningEnabled() && !isPackageSuspended()) { - return false; - } - IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT); @@ -521,12 +517,6 @@ class ActivityStartInterceptor { && (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. */ diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java index d9604395dd98..395ea9176877 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java @@ -16,8 +16,6 @@ package com.android.server.devicepolicy; -import static com.android.server.devicepolicy.DevicePolicyManagerService.DEFAULT_KEEP_PROFILES_RUNNING_FLAG; - import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -200,7 +198,7 @@ class DevicePolicyData { * Effective state of the feature flag. It is updated to the current configuration value * during boot and doesn't change value after than unless overridden by test code. */ - boolean mEffectiveKeepProfilesRunning = DEFAULT_KEEP_PROFILES_RUNNING_FLAG; + boolean mEffectiveKeepProfilesRunning = false; DevicePolicyData(@UserIdInt int userId) { mUserId = userId; @@ -401,7 +399,7 @@ class DevicePolicyData { out.endTag(null, TAG_BYPASS_ROLE_QUALIFICATIONS); } - if (policyData.mEffectiveKeepProfilesRunning != DEFAULT_KEEP_PROFILES_RUNNING_FLAG) { + if (policyData.mEffectiveKeepProfilesRunning) { out.startTag(null, TAG_KEEP_PROFILES_RUNNING); out.attributeBoolean(null, ATTR_VALUE, policyData.mEffectiveKeepProfilesRunning); out.endTag(null, TAG_KEEP_PROFILES_RUNNING); @@ -592,7 +590,7 @@ class DevicePolicyData { policy.mCurrentRoleHolder = parser.getAttributeValue(null, ATTR_VALUE); } else if (TAG_KEEP_PROFILES_RUNNING.equals(tag)) { policy.mEffectiveKeepProfilesRunning = parser.getAttributeBoolean( - null, ATTR_VALUE, DEFAULT_KEEP_PROFILES_RUNNING_FLAG); + null, ATTR_VALUE, false); // Deprecated tags below } else if (TAG_PROTECTED_PACKAGES.equals(tag)) { if (policy.mUserControlDisabledPackages == null) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 1ff117e2c60b..93dc2190c8a3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -873,9 +873,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "enable_permission_based_access"; private static final boolean DEFAULT_VALUE_PERMISSION_BASED_ACCESS_FLAG = false; - // TODO(b/265683382) remove the flag after rollout. - public static final boolean DEFAULT_KEEP_PROFILES_RUNNING_FLAG = false; - // TODO(b/266831522) remove the flag after rollout. private static final String APPLICATION_EXEMPTIONS_FLAG = "application_exemptions"; private static final boolean DEFAULT_APPLICATION_EXEMPTIONS_FLAG = true; @@ -2178,13 +2175,29 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return packageNameAndSignature; } - private void suspendAppsForQuietProfiles(boolean toSuspend) { + private void unsuspendAppsForQuietProfiles() { PackageManagerInternal pmi = mInjector.getPackageManagerInternal(); List<UserInfo> users = mUserManagerInternal.getUsers(true /* excludeDying */); + for (UserInfo user : users) { - if (user.isManagedProfile() && user.isQuietModeEnabled()) { - pmi.setPackagesSuspendedForQuietMode(user.id, toSuspend); + if (!user.isManagedProfile() || !user.isQuietModeEnabled()) { + continue; } + int userId = user.id; + var suspendedByAdmin = getPackagesSuspendedByAdmin(userId); + var packagesToUnsuspend = mInjector.getPackageManager(userId) + .getInstalledPackages(PackageManager.PackageInfoFlags.of( + MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE)) + .stream() + .map(packageInfo -> packageInfo.packageName) + .filter(pkg -> !suspendedByAdmin.contains(pkg)) + .toArray(String[]::new); + + Slogf.i(LOG_TAG, "Unsuspending work apps for user %d", userId); + // When app suspension was used for quiet mode, the apps were suspended by platform + // package, just like when admin suspends them. So although it wasn't admin who + // suspended, this method will remove the right suspension record. + pmi.setPackagesSuspendedByAdmin(userId, packagesToUnsuspend, false /* suspended */); } } @@ -3436,9 +3449,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - // In case flag value has changed, we apply it during boot to avoid doing it concurrently - // with user toggling quiet mode. - setKeepProfileRunningEnabledUnchecked(isKeepProfilesRunningFlagEnabled()); + // Check whether work apps were paused via suspension and unsuspend if necessary. + // TODO: move it into PolicyVersionUpgrader so that it is executed only once. + unsuspendWorkAppsIfNecessary(); } // TODO(b/230841522) Make it static. @@ -11039,9 +11052,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { (size == 1 ? "" : "s")); } pw.println(); - pw.println("Keep profiles running: " - + getUserData(UserHandle.USER_SYSTEM).mEffectiveKeepProfilesRunning); - pw.println(); mPolicyCache.dump(pw); pw.println(); @@ -15539,11 +15549,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @Override - public Set<String> getPackagesSuspendedByAdmin(@UserIdInt int userId) { - return DevicePolicyManagerService.this.getPackagesSuspendedByAdmin(userId); - } - - @Override public void notifyUnsafeOperationStateChanged(DevicePolicySafetyChecker checker, int reason, boolean isSafe) { // TODO(b/178494483): use EventLog instead @@ -15571,11 +15576,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - @Override - public boolean isKeepProfilesRunningEnabled() { - return getUserDataUnchecked(UserHandle.USER_SYSTEM).mEffectiveKeepProfilesRunning; - } - private @Mode int findInteractAcrossProfilesResetMode(String packageName) { return getDefaultCrossProfilePackages().contains(packageName) ? AppOpsManager.MODE_ALLOWED @@ -23028,32 +23028,22 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { DEFAULT_VALUE_PERMISSION_BASED_ACCESS_FLAG); } - private static boolean isKeepProfilesRunningFlagEnabled() { - return DEFAULT_KEEP_PROFILES_RUNNING_FLAG; - } - private boolean isUnicornFlagEnabled() { return false; } - private void setKeepProfileRunningEnabledUnchecked(boolean keepProfileRunning) { + private void unsuspendWorkAppsIfNecessary() { synchronized (getLockObject()) { DevicePolicyData policyData = getUserDataUnchecked(UserHandle.USER_SYSTEM); - if (policyData.mEffectiveKeepProfilesRunning == keepProfileRunning) { + if (!policyData.mEffectiveKeepProfilesRunning) { return; } - policyData.mEffectiveKeepProfilesRunning = keepProfileRunning; + policyData.mEffectiveKeepProfilesRunning = false; saveSettingsLocked(UserHandle.USER_SYSTEM); } - suspendAppsForQuietProfiles(keepProfileRunning); - } - @Override - public void setOverrideKeepProfilesRunning(boolean enabled) { - Preconditions.checkCallAuthorization( - hasCallingOrSelfPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS)); - setKeepProfileRunningEnabledUnchecked(enabled); - Slog.i(LOG_TAG, "Keep profiles running overridden to: " + enabled); + Slog.w(LOG_TAG, "Work apps may have been paused via suspension previously."); + unsuspendAppsForQuietProfiles(); } public void setMtePolicy(int flags, String callerPackageName) { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt index eb001645863f..a6ba5d4c3032 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageHelperTestBase.kt @@ -87,8 +87,8 @@ open class PackageHelperTestBase { TEST_PACKAGE_1, TEST_PACKAGE_2, DEVICE_OWNER_PACKAGE, DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE)) - suspendPackageHelper = SuspendPackageHelper(pms, rule.mocks().injector, - rule.mocks().userManagerService, broadcastHelper, protectedPackages) + suspendPackageHelper = SuspendPackageHelper( + pms, rule.mocks().injector, broadcastHelper, protectedPackages) defaultAppProvider = rule.mocks().defaultAppProvider testHandler = rule.mocks().handler packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!! diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt index 4240373b7c1d..7b381ce443e1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt @@ -39,7 +39,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() verify(pms).scheduleWritePackageRestrictions(eq(TEST_USER_ID)) @@ -56,14 +56,14 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), null /* packageNames */, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isNull() failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOfNulls(0), true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isEmpty() } @@ -73,7 +73,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, TEST_PACKAGE_1, TEST_USER_ID, - Binder.getCallingUid(), false /* forQuietMode */, false /* quarantined */) + Binder.getCallingUid(), false /* quarantined */) assertThat(failedNames).asList().hasSize(1) assertThat(failedNames).asList().contains(TEST_PACKAGE_2) @@ -84,7 +84,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(DEVICE_OWNER_PACKAGE), true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).asList().hasSize(1) assertThat(failedNames).asList().contains(DEVICE_OWNER_PACKAGE) @@ -95,7 +95,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(NONEXISTENT_PACKAGE), true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).asList().hasSize(1) assertThat(failedNames).asList().contains(NONEXISTENT_PACKAGE) @@ -108,7 +108,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), knownPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */)!! + TEST_USER_ID, deviceOwnerUid, false /* quarantined */)!! assertThat(failedNames.size).isEqualTo(knownPackages.size) for (pkg in knownPackages) { @@ -117,33 +117,19 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { } @Test - fun setPackagesSuspended_forQuietMode() { - val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE, - INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, - PERMISSION_CONTROLLER_PACKAGE, MGMT_ROLE_HOLDER_PACKAGE) - val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), - knownPackages, true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */, false /* quarantined */)!! - - assertThat(failedNames.size).isEqualTo(1) - assertThat(failedNames[0]).isEqualTo(MGMT_ROLE_HOLDER_PACKAGE) - } - - @Test fun setPackagesUnsuspended() { val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() Mockito.clearInvocations(broadcastHelper) assertThat(failedNames).isEmpty() failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, false /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() verify(pms, times(2)).scheduleWritePackageRestrictions(eq(TEST_USER_ID)) @@ -191,7 +177,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, appExtras, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, - false /* forQuietMode */, false /* quarantined */) + false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -209,7 +195,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, appExtras, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, - false /* forQuietMode */, false /* quarantined */) + false /* quarantined */) testHandler.flush() Mockito.clearInvocations(broadcastHelper) assertThat(failedNames).isEmpty() @@ -250,7 +236,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, - false /* forQuietMode */, false /* quarantined */) + false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -265,7 +251,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, - TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -280,7 +266,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, - false /* forQuietMode */, false /* quarantined */) + false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -295,7 +281,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */, null /* launcherExtras */, dialogInfo, DEVICE_OWNER_PACKAGE, TEST_USER_ID, - deviceOwnerUid, false /* forQuietMode */, false /* quarantined */) + deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java index 568471d67c31..526201f9c1c6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java @@ -247,39 +247,9 @@ public class ActivityStartInterceptorTest { } @Test - public void testInterceptQuietProfile_keepProfilesRunningEnabled() { - // GIVEN that the user the activity is starting as is currently in quiet mode and - // profiles are kept running when in quiet mode. + public void testInterceptQuietProfile() { + // GIVEN that the user the activity is starting as is currently in quiet mode when(mUserManager.isQuietModeEnabled(eq(UserHandle.of(TEST_USER_ID)))).thenReturn(true); - when(mDevicePolicyManager.isKeepProfilesRunningEnabled()).thenReturn(true); - - // THEN calling intercept returns false because package also has to be suspended. - assertFalse( - mInterceptor.intercept(null, null, mAInfo, null, null, null, 0, 0, null, null)); - } - - @Test - public void testInterceptQuietProfile_keepProfilesRunningDisabled() { - // GIVEN that the user the activity is starting as is currently in quiet mode and - // profiles are stopped when in quiet mode (pre-U behavior, no profile app suspension). - when(mUserManager.isQuietModeEnabled(eq(UserHandle.of(TEST_USER_ID)))).thenReturn(true); - when(mDevicePolicyManager.isKeepProfilesRunningEnabled()).thenReturn(false); - - // THEN calling intercept returns true - assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, null, 0, 0, null, null)); - - // THEN the returned intent is the quiet mode intent - assertTrue(UnlaunchableAppActivity.createInQuietModeDialogIntent(TEST_USER_ID) - .filterEquals(mInterceptor.mIntent)); - } - - @Test - public void testInterceptQuietProfileWhenPackageSuspended_keepProfilesRunningEnabled() { - // GIVEN that the user the activity is starting as is currently in quiet mode, - // the package is suspended and profiles are kept running while in quiet mode. - suspendPackage("com.test.suspending.package"); - when(mUserManager.isQuietModeEnabled(eq(UserHandle.of(TEST_USER_ID)))).thenReturn(true); - when(mDevicePolicyManager.isKeepProfilesRunningEnabled()).thenReturn(true); // THEN calling intercept returns true assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, null, 0, 0, null, null)); @@ -290,12 +260,10 @@ public class ActivityStartInterceptorTest { } @Test - public void testInterceptQuietProfileWhenPackageSuspended_keepProfilesRunningDisabled() { - // GIVEN that the user the activity is starting as is currently in quiet mode, - // the package is suspended and profiles are stopped while in quiet mode. + public void testInterceptQuietProfileWhenPackageSuspended() { suspendPackage("com.test.suspending.package"); + // GIVEN that the user the activity is starting as is currently in quiet mode when(mUserManager.isQuietModeEnabled(eq(UserHandle.of(TEST_USER_ID)))).thenReturn(true); - when(mDevicePolicyManager.isKeepProfilesRunningEnabled()).thenReturn(false); // THEN calling intercept returns true assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, null, 0, 0, null, null)); |