diff options
7 files changed, 34 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index b92625fe14af..a3896797b654 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -4516,7 +4516,7 @@ class ActivityStack extends ConfigurationContainer { */ void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType, @WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed, - boolean crossUser) { + boolean crossUser, ArraySet<Integer> profileIds) { boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this; boolean topTask = true; int userId = UserHandle.getUserId(callingUid); @@ -4527,8 +4527,9 @@ class ActivityStack extends ConfigurationContainer { continue; } if (task.effectiveUid != callingUid) { - if (task.userId != userId && !crossUser) { - // Skip if the caller does not have cross user permission + if (task.userId != userId && !crossUser && !profileIds.contains(task.userId)) { + // Skip if the caller does not have cross user permission or cannot access + // the task's profile continue; } if (!allowed && !task.isActivityTypeHome()) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index d97f0f5041a4..ed7e12c00515 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -215,6 +215,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.text.format.TimeMigrationUtils; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -2512,6 +2513,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); final boolean crossUser = isCrossUserAllowed(callingPid, callingUid); + final int[] profileIds = getUserManager().getProfileIds( + UserHandle.getUserId(callingUid), true); + ArraySet<Integer> callingProfileIds = new ArraySet<>(); + for (int i = 0; i < profileIds.length; i++) { + callingProfileIds.add(profileIds[i]); + } ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>(); synchronized (mGlobalLock) { @@ -2519,7 +2526,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid); mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType, - ignoreWindowingMode, callingUid, allowed, crossUser); + ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds); } return list; diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 50b5902e17d4..d29cc1dbb585 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -2214,9 +2214,9 @@ class RootActivityContainer extends ConfigurationContainer void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list, @WindowConfiguration.ActivityType int ignoreActivityType, @WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid, - boolean allowed, boolean crossUser) { + boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) { mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType, - ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser); + ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds); } void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) { diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 22a9c32a830f..81a85476c53a 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -19,6 +19,7 @@ package com.android.server.wm; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.WindowingMode; +import android.util.ArraySet; import java.util.ArrayList; import java.util.Comparator; @@ -40,7 +41,7 @@ class RunningTasks { void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType, @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays, - int callingUid, boolean allowed, boolean crossUser) { + int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) { // Return early if there are no tasks to fetch if (maxNum <= 0) { return; @@ -55,7 +56,7 @@ class RunningTasks { final ActivityStack stack = display.getChildAt(stackNdx); mTmpStackTasks.clear(); stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode, - callingUid, allowed, crossUser); + callingUid, allowed, crossUser, profileIds); mTmpSortedSet.addAll(mTmpStackTasks); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 55011fb0aa04..94abd346a814 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -62,6 +62,7 @@ import android.os.Bundle; import android.os.RemoteException; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; +import android.util.ArraySet; import android.util.MutableLong; import android.util.SparseBooleanArray; @@ -1003,7 +1004,6 @@ public class RecentTasksTest extends ActivityTestsBase { public void testRecentsComponent_allowApiAccessWithoutPermissions() { doReturn(PackageManager.PERMISSION_DENIED).when(mService) .checkGetTasksPermission(anyString(), anyInt(), anyInt()); - // Set the recents component and ensure that the following calls do not fail mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT); doTestRecentTasksApis(true /* expectNoSecurityException */); @@ -1289,10 +1289,10 @@ public class RecentTasksTest extends ActivityTestsBase { @Override void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType, int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays, - int callingUid, boolean allowed, boolean crossUser) { + int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) { mLastAllowed = allowed; super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays, - callingUid, allowed, crossUser); + callingUid, allowed, crossUser, profileIds); } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java index cdd4c2424421..3e316f674dbf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java @@ -29,6 +29,7 @@ import static org.junit.Assert.assertEquals; import android.app.ActivityManager.RunningTaskInfo; import android.content.ComponentName; import android.platform.test.annotations.Presubmit; +import android.util.ArraySet; import androidx.test.filters.MediumTest; @@ -45,6 +46,8 @@ import java.util.ArrayList; @Presubmit public class RunningTasksTest extends ActivityTestsBase { + private static final ArraySet<Integer> PROFILE_IDS = new ArraySet<>(); + private RunningTasks mRunningTasks; @Before @@ -77,7 +80,8 @@ public class RunningTasksTest extends ActivityTestsBase { final int numFetchTasks = 5; ArrayList<RunningTaskInfo> tasks = new ArrayList<>(); mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, - displays, -1 /* callingUid */, true /* allowed */, true /*crossUser */); + displays, -1 /* callingUid */, true /* allowed */, true /*crossUser */, + PROFILE_IDS); assertThat(tasks).hasSize(numFetchTasks); for (int i = 0; i < numFetchTasks; i++) { assertEquals(numTasks - i - 1, tasks.get(i).id); @@ -87,7 +91,8 @@ public class RunningTasksTest extends ActivityTestsBase { // and does not crash tasks.clear(); mRunningTasks.getTasks(100, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, - displays, -1 /* callingUid */, true /* allowed */, true /* crossUser */); + displays, -1 /* callingUid */, true /* allowed */, true /* crossUser */, + PROFILE_IDS); assertThat(tasks).hasSize(numTasks); for (int i = 0; i < numTasks; i++) { assertEquals(numTasks - i - 1, tasks.get(i).id); diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index 43c6b3580b39..2fe2c41e0036 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -74,6 +74,7 @@ import com.android.server.am.ActivityManagerService; import com.android.server.appop.AppOpsService; import com.android.server.display.color.ColorDisplayService; import com.android.server.input.InputManagerService; +import com.android.server.pm.UserManagerService; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; import com.android.server.statusbar.StatusBarManagerInternal; @@ -100,6 +101,7 @@ public class SystemServicesTestRule implements TestRule { static int sNextTaskId = 100; private final AtomicBoolean mCurrentMessagesProcessed = new AtomicBoolean(false); + private static final int[] TEST_USER_PROFILE_IDS = {}; private Context mContext; private StaticMockitoSession mMockitoSession; @@ -424,6 +426,11 @@ public class SystemServicesTestRule implements TestRule { doReturn(AppOpsManager.MODE_DEFAULT) .when(aos).noteOperation(anyInt(), anyInt(), anyString()); + // UserManagerService + final UserManagerService ums = mock(UserManagerService.class); + doReturn(ums).when(this).getUserManager(); + doReturn(TEST_USER_PROFILE_IDS).when(ums).getProfileIds(anyInt(), eq(true)); + setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class)); ams.mActivityTaskManager = this; ams.mAtmInternal = mInternal; |