Loading services/core/java/com/android/server/wm/ActivityStack.java +4 −3 Original line number Diff line number Diff line Loading @@ -5228,7 +5228,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); Loading @@ -5239,8 +5239,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()) { Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +8 −1 Original line number Diff line number Diff line Loading @@ -215,6 +215,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.text.format.Time; import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; Loading Loading @@ -2526,6 +2527,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) { Loading @@ -2533,7 +2540,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; Loading services/core/java/com/android/server/wm/RootActivityContainer.java +2 −2 Original line number Diff line number Diff line Loading @@ -2266,9 +2266,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.mRunningTasks.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser); ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds); } void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) { Loading services/core/java/com/android/server/wm/RunningTasks.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); } } Loading services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +9 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; import static org.mockito.ArgumentMatchers.eq; import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.AppOpsManager; Loading Loading @@ -72,6 +74,7 @@ import com.android.server.am.ActivityManagerService; import com.android.server.am.PendingIntentController; import com.android.server.appop.AppOpsService; import com.android.server.firewall.IntentFirewall; import com.android.server.pm.UserManagerService; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.wm.TaskRecord.TaskRecordFactory; Loading @@ -92,6 +95,7 @@ import java.util.function.Consumer; */ class ActivityTestsBase { private static int sNextDisplayId = DEFAULT_DISPLAY + 1; private static final int[] TEST_USER_PROFILE_IDS = {}; @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = Loading Loading @@ -471,6 +475,11 @@ class ActivityTestsBase { // allow background activity starts by default doReturn(true).when(this).isBackgroundActivityStartsEnabled(); doNothing().when(this).updateCpuStats(); // UserManager final UserManagerService ums = mock(UserManagerService.class); doReturn(ums).when(this).getUserManager(); doReturn(TEST_USER_PROFILE_IDS).when(ums).getProfileIds(anyInt(), eq(true)); } void setup(IntentFirewall intentFirewall, PendingIntentController intentController, Loading Loading
services/core/java/com/android/server/wm/ActivityStack.java +4 −3 Original line number Diff line number Diff line Loading @@ -5228,7 +5228,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); Loading @@ -5239,8 +5239,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()) { Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +8 −1 Original line number Diff line number Diff line Loading @@ -215,6 +215,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.text.format.Time; import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; Loading Loading @@ -2526,6 +2527,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) { Loading @@ -2533,7 +2540,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; Loading
services/core/java/com/android/server/wm/RootActivityContainer.java +2 −2 Original line number Diff line number Diff line Loading @@ -2266,9 +2266,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.mRunningTasks.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser); ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds); } void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) { Loading
services/core/java/com/android/server/wm/RunningTasks.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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); } } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +9 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; import static org.mockito.ArgumentMatchers.eq; import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.AppOpsManager; Loading Loading @@ -72,6 +74,7 @@ import com.android.server.am.ActivityManagerService; import com.android.server.am.PendingIntentController; import com.android.server.appop.AppOpsService; import com.android.server.firewall.IntentFirewall; import com.android.server.pm.UserManagerService; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.wm.TaskRecord.TaskRecordFactory; Loading @@ -92,6 +95,7 @@ import java.util.function.Consumer; */ class ActivityTestsBase { private static int sNextDisplayId = DEFAULT_DISPLAY + 1; private static final int[] TEST_USER_PROFILE_IDS = {}; @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = Loading Loading @@ -471,6 +475,11 @@ class ActivityTestsBase { // allow background activity starts by default doReturn(true).when(this).isBackgroundActivityStartsEnabled(); doNothing().when(this).updateCpuStats(); // UserManager final UserManagerService ums = mock(UserManagerService.class); doReturn(ums).when(this).getUserManager(); doReturn(TEST_USER_PROFILE_IDS).when(ums).getProfileIds(anyInt(), eq(true)); } void setup(IntentFirewall intentFirewall, PendingIntentController intentController, Loading