content: /*
   * Copyright (C) 2017 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License
   */
  
  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;
  import java.util.Iterator;
  import java.util.List;
  import java.util.TreeSet;
  
  /**
   * Class for resolving the set of running tasks in the system.
   */
  class RunningTasks {
  
      // Comparator to sort by last active time (descending)
      private static final Comparator<TaskRecord> LAST_ACTIVE_TIME_COMPARATOR =
              (o1, o2) -> Long.signum(o2.lastActiveTime - o1.lastActiveTime);
  
      private final TreeSet<TaskRecord> mTmpSortedSet = new TreeSet<>(LAST_ACTIVE_TIME_COMPARATOR);
      private final ArrayList<TaskRecord> mTmpStackTasks = new ArrayList<>();
  
      void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
              @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
              int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
          // Return early if there are no tasks to fetch
          if (maxNum <= 0) {
              return;
          }
  
          // Gather all of the tasks across all of the tasks, and add them to the sorted set
          mTmpSortedSet.clear();
          final int numDisplays = activityDisplays.size();
          for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
              final ActivityDisplay display = activityDisplays.get(displayNdx);
              for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
                  final ActivityStack stack = display.getChildAt(stackNdx);
                  mTmpStackTasks.clear();
                  stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
                          callingUid, allowed, crossUser, profileIds);
                  mTmpSortedSet.addAll(mTmpStackTasks);
              }
          }
  
          // Take the first {@param maxNum} tasks and create running task infos for them
          final Iterator<TaskRecord> iter = mTmpSortedSet.iterator();
          while (iter.hasNext()) {
              if (maxNum == 0) {
                  break;
              }
  
              final TaskRecord task = iter.next();
              list.add(createRunningTaskInfo(task));
              maxNum--;
          }
      }
  
      /**
       * Constructs a {@link RunningTaskInfo} from a given {@param task}.
       */
      private RunningTaskInfo createRunningTaskInfo(TaskRecord task) {
          final RunningTaskInfo rti = new RunningTaskInfo();
          task.fillTaskInfo(rti);
          // Fill in some deprecated values
          rti.id = rti.taskId;
          return rti;
      }
  }
  