From 86b7446c2be77eb7f3638c98e1d554b3ab647d40 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Mon, 2 Jul 2018 08:42:43 -0700 Subject: [PATCH] Break direct calls to UserController object in AMS from activity classes (12/n) Make calls from activity classes go through ActivityManagerInternal interface to case UserController instead of calling AMS.mUserController object directly. Note that calls to UserController should not hold the AMS lock. Bug: 80414790 Test: Existing tests pass Change-Id: Ie56f08d10b62d609e9b5e31f45b5f0d6eed3a9d4 --- .../android/app/ActivityManagerInternal.java | 13 ++++ .../server/am/ActivityManagerService.java | 40 +++++++++++- .../com/android/server/am/ActivityRecord.java | 4 +- .../com/android/server/am/ActivityStack.java | 7 +-- .../server/am/ActivityStackSupervisor.java | 8 +-- .../server/am/ActivityStartController.java | 2 +- .../server/am/ActivityStartInterceptor.java | 8 +-- .../server/am/ActivityTaskManagerService.java | 4 +- .../com/android/server/am/ProcessRecord.java | 7 +++ .../com/android/server/am/RecentTasks.java | 34 +++++++--- .../com/android/server/am/UserController.java | 31 ++++----- .../server/am/WindowProcessController.java | 5 ++ .../server/am/WindowProcessListener.java | 3 + .../am/ActivityStartInterceptorTest.java | 15 +++-- .../android/server/am/ActivityTestsBase.java | 8 ++- .../android/server/am/RecentTasksTest.java | 63 +++++++++---------- 16 files changed, 162 insertions(+), 90 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index ed06f2aaf12ee..7a9a553bb287f 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.IIntentSender; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.UserInfo; import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; @@ -216,4 +217,16 @@ public abstract class ActivityManagerInternal { public abstract void updateOomAdj(); public abstract void sendForegroundProfileChanged(int userId); + + /** + * Returns whether the given user requires credential entry at this time. This is used to + * intercept activity launches for work apps when the Work Challenge is present. + */ + public abstract boolean shouldConfirmCredentials(int userId); + public abstract int[] getCurrentProfileIds(); + public abstract UserInfo getCurrentUser(); + public abstract void ensureNotSpecialUser(int userId); + public abstract boolean isCurrentProfile(int userId); + public abstract boolean hasStartedUserState(int userId); + public abstract void finishUserSwitch(Object uss); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 8786c52d24dce..4733f6543509d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -22319,9 +22319,8 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean isUserRunning(int userId, int flags) { - synchronized (ActivityManagerService.this) { - return mUserController.isUserRunning(userId, flags); - } + // Holding am lock isn't required to call into user controller. + return mUserController.isUserRunning(userId, flags); } @Override @@ -22392,6 +22391,41 @@ public class ActivityManagerService extends IActivityManager.Stub public void sendForegroundProfileChanged(int userId) { mUserController.sendForegroundProfileChanged(userId); } + + @Override + public boolean shouldConfirmCredentials(int userId) { + return mUserController.shouldConfirmCredentials(userId); + } + + @Override + public int[] getCurrentProfileIds() { + return mUserController.getCurrentProfileIds(); + } + + @Override + public UserInfo getCurrentUser() { + return mUserController.getCurrentUser(); + } + + @Override + public void ensureNotSpecialUser(int userId) { + mUserController.ensureNotSpecialUser(userId); + } + + @Override + public boolean isCurrentProfile(int userId) { + return mUserController.isCurrentProfile(userId); + } + + @Override + public boolean hasStartedUserState(int userId) { + return mUserController.hasStartedUserState(userId); + } + + @Override + public void finishUserSwitch(Object uss) { + mUserController.finishUserSwitch((UserState) uss); + } } /** diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index b44ce9aeea338..70f638df6f333 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -1877,7 +1877,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // TODO: To be more accurate, the mark should be before the onCreate, // not after the onResume. But for subsequent starts, onResume is fine. if (hasProcess()) { - cpuTimeAtResume = service.mAm.mProcessCpuTracker.getCpuTimeForPid(app.getPid()); + cpuTimeAtResume = app.getCpuTime(); } else { cpuTimeAtResume = 0; // Couldn't get the cpu time of process } @@ -2186,7 +2186,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0 || (mStackSupervisor.isCurrentProfileLocked(userId) - && service.mAm.mUserController.isUserRunning(userId, 0 /* flags */)); + && service.mAmInternal.isUserRunning(userId, 0 /* flags */)); } /** diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index c76df8bef8668..b0f1c45327cf8 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -457,7 +457,7 @@ class ActivityStack extends ConfigurationContai mHandler = new ActivityStackHandler(supervisor.mLooper); mWindowManager = mService.mWindowManager; mStackId = stackId; - mCurrentUser = mService.mAm.mUserController.getCurrentUserId(); + mCurrentUser = mService.mAmInternal.getCurrentUserId(); mTmpRect2.setEmpty(); // Set display id before setting activity and window type to make sure it won't affect // stacks on a wrong display. @@ -1622,8 +1622,7 @@ class ActivityStack extends ConfigurationContai if (prev.hasProcess() && prev.cpuTimeAtResume > 0 && mService.mAm.mBatteryStatsService.isOnBattery()) { - long diff = mService.mAm.mProcessCpuTracker.getCpuTimeForPid(prev.app.getPid()) - - prev.cpuTimeAtResume; + long diff = prev.app.getCpuTime() - prev.cpuTimeAtResume; if (diff > 0) { BatteryStatsImpl bsi = mService.mAm.mBatteryStatsService.getActiveStatistics(); synchronized (bsi) { @@ -2398,7 +2397,7 @@ class ActivityStack extends ConfigurationContai // Make sure that the user who owns this activity is started. If not, // we will just leave it as is because someone should be bringing // another user's activities to the top of the stack. - if (!mService.mAm.mUserController.hasStartedUserState(next.userId)) { + if (!mService.mAmInternal.hasStartedUserState(next.userId)) { Slog.w(TAG, "Skipping resume of top activity " + next + ": user " + next.userId + " is stopped"); if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 7f749b38773e3..e3e1c48bb1c1d 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2112,12 +2112,12 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // Complete user switch if (startingUsers != null) { for (int i = 0; i < startingUsers.size(); i++) { - mService.mAm.mUserController.finishUserSwitch(startingUsers.get(i)); + mService.mAmInternal.finishUserSwitch(startingUsers.get(i)); } } } - mService.mAm.trimApplications(); + mService.mAmInternal.trimApplications(); //dump(); //mWindowManager.dump(); @@ -3837,7 +3837,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D /** Checks whether the userid is a profile of the current user. */ boolean isCurrentProfileLocked(int userId) { if (userId == mCurrentUser) return true; - return mService.mAm.mUserController.isCurrentProfile(userId); + return mService.mAmInternal.isCurrentProfile(userId); } /** @@ -4789,7 +4789,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // If the user must confirm credentials (e.g. when first launching a work app and the // Work Challenge is present) let startActivityInPackage handle the intercepting. - if (!mService.mAm.mUserController.shouldConfirmCredentials(task.userId) + if (!mService.mAmInternal.shouldConfirmCredentials(task.userId) && task.getRootActivity() != null) { final ActivityRecord targetActivity = task.getTopActivity(); diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java index f7ea4b228e52c..110767174e5c2 100644 --- a/services/core/java/com/android/server/am/ActivityStartController.java +++ b/services/core/java/com/android/server/am/ActivityStartController.java @@ -240,7 +240,7 @@ public class ActivityStartController { return mService.handleIncomingUser( realCallingPid, realCallingUid, targetUserId, reason); } else { - mService.mAm.mUserController.ensureNotSpecialUser(targetUserId); + mService.mAmInternal.ensureNotSpecialUser(targetUserId); return targetUserId; } } diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java index 171c0bbd18123..ca12716e7199f 100644 --- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java @@ -69,7 +69,6 @@ class ActivityStartInterceptor { private final ActivityTaskManagerService mService; private final ActivityStackSupervisor mSupervisor; private final Context mServiceContext; - private final UserController mUserController; // UserManager cannot be final as it's not ready when this class is instantiated during boot private UserManager mUserManager; @@ -101,16 +100,15 @@ class ActivityStartInterceptor { ActivityStartInterceptor( ActivityTaskManagerService service, ActivityStackSupervisor supervisor) { - this(service, supervisor, service.mContext, service.mAm.mUserController); + this(service, supervisor, service.mContext); } @VisibleForTesting ActivityStartInterceptor(ActivityTaskManagerService service, ActivityStackSupervisor supervisor, - Context context, UserController userController) { + Context context) { mService = service; mSupervisor = supervisor; mServiceContext = context; - mUserController = userController; } /** @@ -298,7 +296,7 @@ class ActivityStartInterceptor { * @return The intercepting intent if needed. */ private Intent interceptWithConfirmCredentialsIfNeeded(ActivityInfo aInfo, int userId) { - if (!mUserController.shouldConfirmCredentials(userId)) { + if (!mService.mAmInternal.shouldConfirmCredentials(userId)) { return null; } // TODO(b/28935539): should allow certain activities to bypass work challenge diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java index 50d0212888fec..3ed2875c73773 100644 --- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java @@ -4547,9 +4547,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return mShowDialogs && !mSleeping && !mShuttingDown && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY) && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS, - mAm.mUserController.getCurrentUserId()) + mAmInternal.getCurrentUserId()) && !(UserManager.isDeviceInDemoMode(mContext) - && mAm.mUserController.getCurrentUser().isDemo()); + && mAmInternal.getCurrentUser().isDemo()); } /** diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 5a44ab6a37fbc..5bf8bcc54621a 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -999,4 +999,11 @@ final class ProcessRecord implements WindowProcessListener { } } + /** + * Returns the total time (in milliseconds) spent executing in both user and system code. + * Safe to call without lock held. + */ + public long getCpuTime() { + return mService.mProcessCpuTracker.getCpuTimeForPid(pid); + } } diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index 749589b970b37..1967c76b23e34 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -78,6 +78,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -140,7 +141,6 @@ class RecentTasks { private final TaskPersister mTaskPersister; private final ActivityTaskManagerService mService; private final ActivityStackSupervisor mSupervisor; - private final UserController mUserController; /** * Keeps track of the static recents package/component which is granted additional permissions @@ -181,11 +181,9 @@ class RecentTasks { private final TaskActivitiesReport mTmpReport = new TaskActivitiesReport(); @VisibleForTesting - RecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister, - UserController userController) { + RecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) { mService = service; mSupervisor = mService.mStackSupervisor; - mUserController = userController; mTaskPersister = taskPersister; mGlobalMaxNumTasks = ActivityTaskManager.getMaxRecentTasksStatic(); mHasVisibleRecentTasks = true; @@ -196,7 +194,6 @@ class RecentTasks { final Resources res = service.mContext.getResources(); mService = service; mSupervisor = mService.mStackSupervisor; - mUserController = service.mAm.mUserController; mTaskPersister = new TaskPersister(systemDir, stackSupervisor, service, this); mGlobalMaxNumTasks = ActivityTaskManager.getMaxRecentTasksStatic(); mHasVisibleRecentTasks = res.getBoolean(com.android.internal.R.bool.config_hasRecents); @@ -712,6 +709,27 @@ class RecentTasks { return list; } + @VisibleForTesting + Set getProfileIds(int userId) { + Set userIds = new ArraySet<>(); + final List profiles = mService.getUserManager().getProfiles(userId, + false /* enabledOnly */); + for (int i = profiles.size() - 1; i >= 0; --i) { + userIds.add(profiles.get(i).id); + } + return userIds; + } + + @VisibleForTesting + UserInfo getUserInfo(int userId) { + return mService.getUserManager().getUserInfo(userId); + } + + @VisibleForTesting + int[] getCurrentProfileIds() { + return mService.mAmInternal.getCurrentProfileIds(); + } + /** * @return the list of recent tasks for presentation. */ @@ -725,7 +743,7 @@ class RecentTasks { } loadUserRecentsLocked(userId); - final Set includedUsers = mUserController.getProfileIds(userId); + final Set includedUsers = getProfileIds(userId); includedUsers.add(Integer.valueOf(userId)); final ArrayList res = new ArrayList<>(); @@ -1040,10 +1058,10 @@ class RecentTasks { } // Remove any tasks that belong to currently quiet profiles - final int[] profileUserIds = mUserController.getCurrentProfileIds(); + final int[] profileUserIds = getCurrentProfileIds(); mTmpQuietProfileUserIds.clear(); for (int userId : profileUserIds) { - final UserInfo userInfo = mUserController.getUserInfo(userId); + final UserInfo userInfo = getUserInfo(userId); if (userInfo != null && userInfo.isManagedProfile() && userInfo.isQuietModeEnabled()) { mTmpQuietProfileUserIds.put(userId, true); } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 992179a2637b9..fa670a250886e 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -259,11 +259,14 @@ class UserController implements Handler.Callback { } void finishUserSwitch(UserState uss) { - finishUserBoot(uss); - startProfiles(); - synchronized (mLock) { - stopRunningUsersLU(mMaxRunningUsers); - } + // This call holds the AM lock so we post to the handler. + mHandler.post(() -> { + finishUserBoot(uss); + startProfiles(); + synchronized (mLock) { + stopRunningUsersLU(mMaxRunningUsers); + } + }); } List getRunningUsersLU() { @@ -1573,7 +1576,9 @@ class UserController implements Handler.Callback { } boolean hasStartedUserState(int userId) { - return mStartedUsers.get(userId) != null; + synchronized (mLock) { + return mStartedUsers.get(userId) != null; + } } private void updateStartedUserArrayLU() { @@ -1749,7 +1754,7 @@ class UserController implements Handler.Callback { return ums != null ? ums.getUserIds() : new int[] { 0 }; } - UserInfo getUserInfo(int userId) { + private UserInfo getUserInfo(int userId) { return mInjector.getUserManager().getUserInfo(userId); } @@ -1775,7 +1780,7 @@ class UserController implements Handler.Callback { return mInjector.getUserManager().exists(userId); } - void enforceShellRestriction(String restriction, int userHandle) { + private void enforceShellRestriction(String restriction, int userHandle) { if (Binder.getCallingUid() == SHELL_UID) { if (userHandle < 0 || hasUserRestriction(restriction, userHandle)) { throw new SecurityException("Shell does not have permission to access user " @@ -1788,16 +1793,6 @@ class UserController implements Handler.Callback { return mInjector.getUserManager().hasUserRestriction(restriction, userId); } - Set getProfileIds(int userId) { - Set userIds = new HashSet<>(); - final List profiles = mInjector.getUserManager().getProfiles(userId, - false /* enabledOnly */); - for (UserInfo user : profiles) { - userIds.add(user.id); - } - return userIds; - } - boolean isSameProfileGroup(int callingUserId, int targetUserId) { if (callingUserId == targetUserId) { return true; diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java index 64a273efc4eef..817905a5e3d41 100644 --- a/services/core/java/com/android/server/am/WindowProcessController.java +++ b/services/core/java/com/android/server/am/WindowProcessController.java @@ -478,6 +478,11 @@ public class WindowProcessController { mAtm.mH.post(r); } + /** Returns the total time (in milliseconds) spent executing in both user and system code. */ + public long getCpuTime() { + return (mListener != null) ? mListener.getCpuTime() : 0; + } + void addRecentTask(TaskRecord task) { mRecentTasks.add(task); } diff --git a/services/core/java/com/android/server/am/WindowProcessListener.java b/services/core/java/com/android/server/am/WindowProcessListener.java index 92e4461c4452a..2de3e37630281 100644 --- a/services/core/java/com/android/server/am/WindowProcessListener.java +++ b/services/core/java/com/android/server/am/WindowProcessListener.java @@ -44,4 +44,7 @@ public interface WindowProcessListener { /** Set process package been removed from device. */ void setRemoved(boolean removed); + + /** Returns the total time (in milliseconds) spent executing in both user and system code. */ + long getCpuTime(); } diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java index 7f55824b30821..420987d035092 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java @@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.when; +import android.app.ActivityManagerInternal; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManagerInternal; import android.content.Context; @@ -94,11 +95,11 @@ public class ActivityStartInterceptorTest { @Mock private UserManager mUserManager; @Mock - private UserController mUserController; - @Mock private KeyguardManager mKeyguardManager; @Mock private PackageManagerService mPackageManager; + @Mock + private ActivityManagerInternal mAmInternal; private ActivityStartInterceptor mInterceptor; private ActivityInfo mAInfo = new ActivityInfo(); @@ -107,11 +108,15 @@ public class ActivityStartInterceptorTest { public void setUp() { MockitoAnnotations.initMocks(this); mService.mAm = mAm; - mInterceptor = new ActivityStartInterceptor(mService, mSupervisor, mContext, - mUserController); + mService.mAmInternal = mAmInternal; + mInterceptor = new ActivityStartInterceptor(mService, mSupervisor, mContext); mInterceptor.setStates(TEST_USER_ID, TEST_REAL_CALLING_PID, TEST_REAL_CALLING_UID, TEST_START_FLAGS, TEST_CALLING_PACKAGE); + // Mock ActivityManagerInternal + LocalServices.removeServiceForTest(ActivityManagerInternal.class); + LocalServices.addService(ActivityManagerInternal.class, mAmInternal); + // Mock DevicePolicyManagerInternal LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class); LocalServices.addService(DevicePolicyManagerInternal.class, @@ -193,7 +198,7 @@ public class ActivityStartInterceptorTest { @Test public void testWorkChallenge() { // GIVEN that the user the activity is starting as is currently locked - when(mUserController.shouldConfirmCredentials(TEST_USER_ID)).thenReturn(true); + when(mAmInternal.shouldConfirmCredentials(TEST_USER_ID)).thenReturn(true); // THEN calling intercept returns true mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 41c89554b1a43..f2d3eb6acd476 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -106,13 +106,15 @@ public class ActivityTestsBase { } protected ActivityTaskManagerService createActivityTaskManagerService() { - final TestActivityTaskManagerService atm = spy(new TestActivityTaskManagerService(mContext)); + final TestActivityTaskManagerService atm = + spy(new TestActivityTaskManagerService(mContext)); setupActivityManagerService(atm); return atm; } - protected ActivityManagerService createActivityManagerService() { - final TestActivityTaskManagerService atm = spy(new TestActivityTaskManagerService(mContext)); + ActivityManagerService createActivityManagerService() { + final TestActivityTaskManagerService atm = + spy(new TestActivityTaskManagerService(mContext)); return setupActivityManagerService(atm); } diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java index a4e4409f3eb98..3547b0ddcadff 100644 --- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java +++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java @@ -108,37 +108,6 @@ public class RecentTasksTest extends ActivityTestsBase { private CallbacksRecorder mCallbacksRecorder; - class TestUserController extends UserController { - TestUserController(ActivityManagerService service) { - super(service); - } - - @Override - int[] getCurrentProfileIds() { - return new int[] { TEST_USER_0_ID, TEST_QUIET_USER_ID }; - } - - @Override - Set getProfileIds(int userId) { - Set profileIds = new HashSet<>(); - profileIds.add(TEST_USER_0_ID); - profileIds.add(TEST_QUIET_USER_ID); - return profileIds; - } - - @Override - UserInfo getUserInfo(int userId) { - switch (userId) { - case TEST_USER_0_ID: - case TEST_USER_1_ID: - return DEFAULT_USER_INFO; - case TEST_QUIET_USER_ID: - return QUIET_USER_INFO; - } - return null; - } - } - @Before @Override public void setUp() throws Exception { @@ -829,7 +798,7 @@ public class RecentTasksTest extends ActivityTestsBase { @Override protected RecentTasks createRecentTasks() { - return new TestRecentTasks(this, mTaskPersister, new TestUserController(mAm)); + return new TestRecentTasks(this, mTaskPersister); } @Override @@ -954,9 +923,33 @@ public class RecentTasksTest extends ActivityTestsBase { boolean lastAllowed; - TestRecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister, - UserController userController) { - super(service, taskPersister, userController); + TestRecentTasks(ActivityTaskManagerService service, TaskPersister taskPersister) { + super(service, taskPersister); + } + + @Override + Set getProfileIds(int userId) { + Set profileIds = new HashSet<>(); + profileIds.add(TEST_USER_0_ID); + profileIds.add(TEST_QUIET_USER_ID); + return profileIds; + } + + @Override + UserInfo getUserInfo(int userId) { + switch (userId) { + case TEST_USER_0_ID: + case TEST_USER_1_ID: + return DEFAULT_USER_INFO; + case TEST_QUIET_USER_ID: + return QUIET_USER_INFO; + } + return null; + } + + @Override + int[] getCurrentProfileIds() { + return new int[] { TEST_USER_0_ID, TEST_QUIET_USER_ID }; } @Override