Return tasks that belong to a profile from getRunningTasks.
See also ag/9307763 bug: 140813306 Test: cts-tradefed run cts-dev -m CtsPermissionTestCases -t android.permission.cts.NoActivityRelatedPermissionTest#testGetTask Test: cts-tradefed run cts-dev -m CtsWindowManagerDeviceTestCases Test: cts-tradefed run cts-dev -m CtsAppTestCases Change-Id: I6809c459af7442a306ccdd81bc036ad81d02030a
This commit is contained in:
@@ -4516,7 +4516,7 @@ class ActivityStack extends ConfigurationContainer {
|
|||||||
*/
|
*/
|
||||||
void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType,
|
void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType,
|
||||||
@WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed,
|
@WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed,
|
||||||
boolean crossUser) {
|
boolean crossUser, ArraySet<Integer> profileIds) {
|
||||||
boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this;
|
boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this;
|
||||||
boolean topTask = true;
|
boolean topTask = true;
|
||||||
int userId = UserHandle.getUserId(callingUid);
|
int userId = UserHandle.getUserId(callingUid);
|
||||||
@@ -4527,8 +4527,9 @@ class ActivityStack extends ConfigurationContainer {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (task.effectiveUid != callingUid) {
|
if (task.effectiveUid != callingUid) {
|
||||||
if (task.userId != userId && !crossUser) {
|
if (task.userId != userId && !crossUser && !profileIds.contains(task.userId)) {
|
||||||
// Skip if the caller does not have cross user permission
|
// Skip if the caller does not have cross user permission or cannot access
|
||||||
|
// the task's profile
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!allowed && !task.isActivityTypeHome()) {
|
if (!allowed && !task.isActivityTypeHome()) {
|
||||||
|
|||||||
@@ -215,6 +215,7 @@ import android.telecom.TelecomManager;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.format.TimeMigrationUtils;
|
import android.text.format.TimeMigrationUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
|
import android.util.ArraySet;
|
||||||
import android.util.EventLog;
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
@@ -2512,6 +2513,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
|
|||||||
final int callingUid = Binder.getCallingUid();
|
final int callingUid = Binder.getCallingUid();
|
||||||
final int callingPid = Binder.getCallingPid();
|
final int callingPid = Binder.getCallingPid();
|
||||||
final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
|
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<>();
|
ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
|
||||||
|
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
@@ -2519,7 +2526,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
|
|||||||
|
|
||||||
final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
|
final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
|
||||||
mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
|
mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
|
||||||
ignoreWindowingMode, callingUid, allowed, crossUser);
|
ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
|
|||||||
@@ -2214,9 +2214,9 @@ class RootActivityContainer extends ConfigurationContainer
|
|||||||
void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
|
void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
|
||||||
@WindowConfiguration.ActivityType int ignoreActivityType,
|
@WindowConfiguration.ActivityType int ignoreActivityType,
|
||||||
@WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid,
|
@WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid,
|
||||||
boolean allowed, boolean crossUser) {
|
boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
|
||||||
mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType,
|
mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType,
|
||||||
ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser);
|
ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
|
void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.server.wm;
|
|||||||
import android.app.ActivityManager.RunningTaskInfo;
|
import android.app.ActivityManager.RunningTaskInfo;
|
||||||
import android.app.WindowConfiguration.ActivityType;
|
import android.app.WindowConfiguration.ActivityType;
|
||||||
import android.app.WindowConfiguration.WindowingMode;
|
import android.app.WindowConfiguration.WindowingMode;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
@@ -40,7 +41,7 @@ class RunningTasks {
|
|||||||
|
|
||||||
void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
|
void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
|
||||||
@WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
|
@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
|
// Return early if there are no tasks to fetch
|
||||||
if (maxNum <= 0) {
|
if (maxNum <= 0) {
|
||||||
return;
|
return;
|
||||||
@@ -55,7 +56,7 @@ class RunningTasks {
|
|||||||
final ActivityStack stack = display.getChildAt(stackNdx);
|
final ActivityStack stack = display.getChildAt(stackNdx);
|
||||||
mTmpStackTasks.clear();
|
mTmpStackTasks.clear();
|
||||||
stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
|
stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
|
||||||
callingUid, allowed, crossUser);
|
callingUid, allowed, crossUser, profileIds);
|
||||||
mTmpSortedSet.addAll(mTmpStackTasks);
|
mTmpSortedSet.addAll(mTmpStackTasks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import android.os.Bundle;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
|
import android.util.ArraySet;
|
||||||
import android.util.MutableLong;
|
import android.util.MutableLong;
|
||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
|
|
||||||
@@ -1003,7 +1004,6 @@ public class RecentTasksTest extends ActivityTestsBase {
|
|||||||
public void testRecentsComponent_allowApiAccessWithoutPermissions() {
|
public void testRecentsComponent_allowApiAccessWithoutPermissions() {
|
||||||
doReturn(PackageManager.PERMISSION_DENIED).when(mService)
|
doReturn(PackageManager.PERMISSION_DENIED).when(mService)
|
||||||
.checkGetTasksPermission(anyString(), anyInt(), anyInt());
|
.checkGetTasksPermission(anyString(), anyInt(), anyInt());
|
||||||
|
|
||||||
// Set the recents component and ensure that the following calls do not fail
|
// Set the recents component and ensure that the following calls do not fail
|
||||||
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT);
|
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT);
|
||||||
doTestRecentTasksApis(true /* expectNoSecurityException */);
|
doTestRecentTasksApis(true /* expectNoSecurityException */);
|
||||||
@@ -1289,10 +1289,10 @@ public class RecentTasksTest extends ActivityTestsBase {
|
|||||||
@Override
|
@Override
|
||||||
void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
|
void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
|
||||||
int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
|
int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
|
||||||
int callingUid, boolean allowed, boolean crossUser) {
|
int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
|
||||||
mLastAllowed = allowed;
|
mLastAllowed = allowed;
|
||||||
super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
|
super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
|
||||||
callingUid, allowed, crossUser);
|
callingUid, allowed, crossUser, profileIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import static org.junit.Assert.assertEquals;
|
|||||||
import android.app.ActivityManager.RunningTaskInfo;
|
import android.app.ActivityManager.RunningTaskInfo;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
|
||||||
import androidx.test.filters.MediumTest;
|
import androidx.test.filters.MediumTest;
|
||||||
|
|
||||||
@@ -45,6 +46,8 @@ import java.util.ArrayList;
|
|||||||
@Presubmit
|
@Presubmit
|
||||||
public class RunningTasksTest extends ActivityTestsBase {
|
public class RunningTasksTest extends ActivityTestsBase {
|
||||||
|
|
||||||
|
private static final ArraySet<Integer> PROFILE_IDS = new ArraySet<>();
|
||||||
|
|
||||||
private RunningTasks mRunningTasks;
|
private RunningTasks mRunningTasks;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -77,7 +80,8 @@ public class RunningTasksTest extends ActivityTestsBase {
|
|||||||
final int numFetchTasks = 5;
|
final int numFetchTasks = 5;
|
||||||
ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
|
ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
|
||||||
mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED,
|
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);
|
assertThat(tasks).hasSize(numFetchTasks);
|
||||||
for (int i = 0; i < numFetchTasks; i++) {
|
for (int i = 0; i < numFetchTasks; i++) {
|
||||||
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
||||||
@@ -87,7 +91,8 @@ public class RunningTasksTest extends ActivityTestsBase {
|
|||||||
// and does not crash
|
// and does not crash
|
||||||
tasks.clear();
|
tasks.clear();
|
||||||
mRunningTasks.getTasks(100, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED,
|
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);
|
assertThat(tasks).hasSize(numTasks);
|
||||||
for (int i = 0; i < numTasks; i++) {
|
for (int i = 0; i < numTasks; i++) {
|
||||||
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ import com.android.server.am.ActivityManagerService;
|
|||||||
import com.android.server.appop.AppOpsService;
|
import com.android.server.appop.AppOpsService;
|
||||||
import com.android.server.display.color.ColorDisplayService;
|
import com.android.server.display.color.ColorDisplayService;
|
||||||
import com.android.server.input.InputManagerService;
|
import com.android.server.input.InputManagerService;
|
||||||
|
import com.android.server.pm.UserManagerService;
|
||||||
import com.android.server.policy.PermissionPolicyInternal;
|
import com.android.server.policy.PermissionPolicyInternal;
|
||||||
import com.android.server.policy.WindowManagerPolicy;
|
import com.android.server.policy.WindowManagerPolicy;
|
||||||
import com.android.server.statusbar.StatusBarManagerInternal;
|
import com.android.server.statusbar.StatusBarManagerInternal;
|
||||||
@@ -100,6 +101,7 @@ public class SystemServicesTestRule implements TestRule {
|
|||||||
static int sNextTaskId = 100;
|
static int sNextTaskId = 100;
|
||||||
|
|
||||||
private final AtomicBoolean mCurrentMessagesProcessed = new AtomicBoolean(false);
|
private final AtomicBoolean mCurrentMessagesProcessed = new AtomicBoolean(false);
|
||||||
|
private static final int[] TEST_USER_PROFILE_IDS = {};
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private StaticMockitoSession mMockitoSession;
|
private StaticMockitoSession mMockitoSession;
|
||||||
@@ -424,6 +426,11 @@ public class SystemServicesTestRule implements TestRule {
|
|||||||
doReturn(AppOpsManager.MODE_DEFAULT)
|
doReturn(AppOpsManager.MODE_DEFAULT)
|
||||||
.when(aos).noteOperation(anyInt(), anyInt(), anyString());
|
.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));
|
setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
|
||||||
ams.mActivityTaskManager = this;
|
ams.mActivityTaskManager = this;
|
||||||
ams.mAtmInternal = mInternal;
|
ams.mAtmInternal = mInternal;
|
||||||
|
|||||||
Reference in New Issue
Block a user