blob: 81a85476c53a49636d20c6862dd0ea9b69acd554 [file] [log] [blame]
Winson Chung61c9e5a2017-10-11 10:39:32 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
Wale Ogunwale59507092018-10-29 09:00:30 -070017package com.android.server.wm;
Winson Chung61c9e5a2017-10-11 10:39:32 -070018
Winson Chung61c9e5a2017-10-11 10:39:32 -070019import android.app.ActivityManager.RunningTaskInfo;
20import android.app.WindowConfiguration.ActivityType;
21import android.app.WindowConfiguration.WindowingMode;
Nicholas Sauerd6b44522019-09-10 20:23:41 -070022import android.util.ArraySet;
Winson Chung61c9e5a2017-10-11 10:39:32 -070023
24import java.util.ArrayList;
25import java.util.Comparator;
26import java.util.Iterator;
27import java.util.List;
28import java.util.TreeSet;
29
30/**
31 * Class for resolving the set of running tasks in the system.
32 */
33class RunningTasks {
34
35 // Comparator to sort by last active time (descending)
36 private static final Comparator<TaskRecord> LAST_ACTIVE_TIME_COMPARATOR =
37 (o1, o2) -> Long.signum(o2.lastActiveTime - o1.lastActiveTime);
38
Winson Chung61c9e5a2017-10-11 10:39:32 -070039 private final TreeSet<TaskRecord> mTmpSortedSet = new TreeSet<>(LAST_ACTIVE_TIME_COMPARATOR);
40 private final ArrayList<TaskRecord> mTmpStackTasks = new ArrayList<>();
41
42 void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
Riddle Hsu86cb7de2018-08-13 23:29:58 +080043 @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
Nicholas Sauerd6b44522019-09-10 20:23:41 -070044 int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
Winson Chung39072852017-11-01 17:09:48 -070045 // Return early if there are no tasks to fetch
46 if (maxNum <= 0) {
47 return;
48 }
Winson Chung61c9e5a2017-10-11 10:39:32 -070049
50 // Gather all of the tasks across all of the tasks, and add them to the sorted set
51 mTmpSortedSet.clear();
Winson Chung61c9e5a2017-10-11 10:39:32 -070052 final int numDisplays = activityDisplays.size();
53 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
Riddle Hsu86cb7de2018-08-13 23:29:58 +080054 final ActivityDisplay display = activityDisplays.get(displayNdx);
Winson Chung61c9e5a2017-10-11 10:39:32 -070055 for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
56 final ActivityStack stack = display.getChildAt(stackNdx);
Winson Chungd2199602018-08-10 10:53:32 -070057 mTmpStackTasks.clear();
Winson Chung61c9e5a2017-10-11 10:39:32 -070058 stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
Nicholas Sauerd6b44522019-09-10 20:23:41 -070059 callingUid, allowed, crossUser, profileIds);
Winson Chungd2199602018-08-10 10:53:32 -070060 mTmpSortedSet.addAll(mTmpStackTasks);
Winson Chung61c9e5a2017-10-11 10:39:32 -070061 }
62 }
63
64 // Take the first {@param maxNum} tasks and create running task infos for them
65 final Iterator<TaskRecord> iter = mTmpSortedSet.iterator();
66 while (iter.hasNext()) {
67 if (maxNum == 0) {
68 break;
69 }
70
71 final TaskRecord task = iter.next();
72 list.add(createRunningTaskInfo(task));
73 maxNum--;
74 }
75 }
76
77 /**
78 * Constructs a {@link RunningTaskInfo} from a given {@param task}.
79 */
80 private RunningTaskInfo createRunningTaskInfo(TaskRecord task) {
Winson Chungabfdcce2018-07-02 17:23:33 -070081 final RunningTaskInfo rti = new RunningTaskInfo();
Mark Renoufc808f062019-02-07 15:20:37 -050082 task.fillTaskInfo(rti);
Winson Chungabfdcce2018-07-02 17:23:33 -070083 // Fill in some deprecated values
84 rti.id = rti.taskId;
85 return rti;
Winson Chung61c9e5a2017-10-11 10:39:32 -070086 }
87}