Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61c9e5a6 authored by Winson Chung's avatar Winson Chung
Browse files

5/Organize and make running tasks code more efficient

- Move running task code from stack/supervisor into its own class
- Reduce work to calculate running tasks. Instead of creating RunningTaskInfo
  for every single task and then limiting to the requested set, calculate
  the set and then create the infos.
- Consolidate calculation of number of running activities in a task between
  the RecentTaskInfo and the RunningTaskInfo
- Remove unused flag argument, adding another method to instead filter the
  collection of running tasks to exclude certain activity types and windowing
  modes.  This allows us to fetch only the last running task in SystemUI and
  not have additional logic on our side.

Bug: 34270611
Test: runtest --path frameworks/base/services/tests/servicestests/src/com/android/server/am/RunningTasksTest.java
Change-Id: Iaba7487cea0545f69739da7cd3095b500a0df6fc
parent bb18e329
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1900,7 +1900,7 @@ public class ActivityManager {
    public List<RunningTaskInfo> getRunningTasks(int maxNum)
            throws SecurityException {
        try {
            return getService().getTasks(maxNum, 0);
            return getService().getTasks(maxNum);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
+3 −1
Original line number Diff line number Diff line
@@ -115,7 +115,9 @@ interface IActivityManager {
            in PersistableBundle persistentState, in CharSequence description);
    String getCallingPackage(in IBinder token);
    ComponentName getCallingActivity(in IBinder token);
    List<ActivityManager.RunningTaskInfo> getTasks(int maxNum, int flags);
    List<ActivityManager.RunningTaskInfo> getTasks(int maxNum);
    List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum, int ignoreActivityType,
            int ignoreWindowingMode);
    void moveTaskToFront(int task, int flags, in Bundle options);
    void moveTaskBackwards(int task);
    int getTaskForActivity(in IBinder token, in boolean onlyRoot);
+2 −2
Original line number Diff line number Diff line
@@ -599,8 +599,8 @@ public class PipManager implements BasePipManager {
    private boolean isSettingsShown() {
        List<RunningTaskInfo> runningTasks;
        try {
            runningTasks = mActivityManager.getTasks(1, 0);
            if (runningTasks == null || runningTasks.size() == 0) {
            runningTasks = mActivityManager.getTasks(1);
            if (runningTasks.isEmpty()) {
                return false;
            }
        } catch (RemoteException e) {
+9 −17
Original line number Diff line number Diff line
@@ -200,26 +200,18 @@ public class SystemServicesProxy {
     */
    public ActivityManager.RunningTaskInfo getRunningTask() {
        // Note: The set of running tasks from the system is ordered by recency
        List<ActivityManager.RunningTaskInfo> tasks = mAm.getRunningTasks(10);
        if (tasks == null || tasks.isEmpty()) {
        try {
            List<ActivityManager.RunningTaskInfo> tasks = mIam.getFilteredTasks(1,
                    ACTIVITY_TYPE_RECENTS /* ignoreActivityType */,
                    WINDOWING_MODE_PINNED /* ignoreWindowingMode */);
            if (tasks.isEmpty()) {
                return null;
            }

        // Find the first task in a valid stack, we ignore everything from the Recents and PiP
        // stacks
        for (int i = 0; i < tasks.size(); i++) {
            final ActivityManager.RunningTaskInfo task = tasks.get(i);
            final WindowConfiguration winConfig = task.configuration.windowConfiguration;
            if (winConfig.getActivityType() == ACTIVITY_TYPE_RECENTS) {
                continue;
            }
            if (winConfig.getWindowingMode() == WINDOWING_MODE_PINNED) {
                continue;
            }
            return task;
        }
            return tasks.get(0);
        } catch (RemoteException e) {
            return null;
        }
    }

    /**
     * Returns whether the recents activity is currently visible.
+15 −7
Original line number Diff line number Diff line
@@ -29,11 +29,13 @@ import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
import static android.app.ActivityManager.RESIZE_MODE_PRESERVE_WINDOW;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
@@ -227,6 +229,8 @@ import android.app.PictureInPictureParams;
import android.app.ProfilerInfo;
import android.app.RemoteAction;
import android.app.WaitResult;
import android.app.WindowConfiguration.ActivityType;
import android.app.WindowConfiguration.WindowingMode;
import android.app.admin.DevicePolicyManager;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
@@ -9770,19 +9774,23 @@ public class ActivityManagerService extends IActivityManager.Stub
    }
    @Override
    public List<RunningTaskInfo> getTasks(int maxNum, int flags) {
    public List<RunningTaskInfo> getTasks(int maxNum) {
       return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
    }
    @Override
    public List<RunningTaskInfo> getFilteredTasks(int maxNum, @ActivityType int ignoreActivityType,
            @WindowingMode int ignoreWindowingMode) {
        final int callingUid = Binder.getCallingUid();
        ArrayList<RunningTaskInfo> list = new ArrayList<RunningTaskInfo>();
        ArrayList<RunningTaskInfo> list = new ArrayList<>();
        synchronized(this) {
            if (DEBUG_ALL) Slog.v(
                TAG, "getTasks: max=" + maxNum + ", flags=" + flags);
            if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
            final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
                    callingUid);
            // TODO: Improve with MRU list from all ActivityStacks.
            mStackSupervisor.getTasksLocked(maxNum, list, callingUid, allowed);
            mStackSupervisor.getRunningTasks(maxNum, list, ignoreActivityType,
                    ignoreWindowingMode, callingUid, allowed);
        }
        return list;
Loading