Loading services/core/java/com/android/server/wm/ActivityStack.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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()) { 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.TimeMigrationUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; Loading Loading @@ -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) { Loading @@ -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; Loading services/core/java/com/android/server/wm/RootActivityContainer.java +2 −2 Original line number Diff line number Diff line Loading @@ -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) { 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/RecentTasksTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading Loading @@ -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); } } } Loading
services/core/java/com/android/server/wm/ActivityStack.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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()) { 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.TimeMigrationUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; Loading Loading @@ -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) { Loading @@ -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; Loading
services/core/java/com/android/server/wm/RootActivityContainer.java +2 −2 Original line number Diff line number Diff line Loading @@ -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) { 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/RecentTasksTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */); Loading Loading @@ -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); } } }