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

Commit 825f041a authored by Evan Rosky's avatar Evan Rosky Committed by Android (Google) Code Review
Browse files

Merge "Add utility to get all root tasks on a display"

parents 0f7945a4 29d4a0a5
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -52,7 +52,11 @@ interface ITaskOrganizerController {
    boolean deleteRootTask(IWindowContainer task);
    boolean deleteRootTask(IWindowContainer task);


    /** Gets direct child tasks (ordered from top-to-bottom) */
    /** Gets direct child tasks (ordered from top-to-bottom) */
    List<ActivityManager.RunningTaskInfo> getChildTasks(in IWindowContainer parent);
    List<ActivityManager.RunningTaskInfo> getChildTasks(in IWindowContainer parent,
            in int[] activityTypes);

    /** Gets all root tasks on a display (ordered from top-to-bottom) */
    List<ActivityManager.RunningTaskInfo> getRootTasks(int displayId, in int[] activityTypes);


    /** Get the root task which contains the current ime target */
    /** Get the root task which contains the current ime target */
    IWindowContainer getImeTarget(int display);
    IWindowContainer getImeTarget(int display);
+2 −0
Original line number Original line Diff line number Diff line
@@ -2795,6 +2795,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }
        }
    }
    }


    // TODO(148895075): deprecate and replace with task equivalents
    @Override
    @Override
    public List<ActivityManager.StackInfo> getAllStackInfos() {
    public List<ActivityManager.StackInfo> getAllStackInfos() {
        enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
        enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
@@ -2821,6 +2822,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }
        }
    }
    }


    // TODO(148895075): deprecate and replace with task equivalents
    @Override
    @Override
    public List<ActivityManager.StackInfo> getAllStackInfosOnDisplay(int displayId) {
    public List<ActivityManager.StackInfo> getAllStackInfosOnDisplay(int displayId) {
        enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
        enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
+41 −1
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import android.view.IWindowContainer;
import android.view.SurfaceControl;
import android.view.SurfaceControl;
import android.view.WindowContainerTransaction;
import android.view.WindowContainerTransaction;


import com.android.internal.util.ArrayUtils;
import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.internal.util.function.pooled.PooledLambda;


@@ -379,7 +380,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub
    }
    }


    @Override
    @Override
    public List<RunningTaskInfo> getChildTasks(IWindowContainer parent) {
    public List<RunningTaskInfo> getChildTasks(IWindowContainer parent,
            @Nullable int[] activityTypes) {
        enforceStackPermission("getChildTasks()");
        enforceStackPermission("getChildTasks()");
        final long ident = Binder.clearCallingIdentity();
        final long ident = Binder.clearCallingIdentity();
        try {
        try {
@@ -405,6 +407,10 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub
                for (int i = dc.getStackCount() - 1; i >= 0; --i) {
                for (int i = dc.getStackCount() - 1; i >= 0; --i) {
                    final ActivityStack as = dc.getStackAt(i);
                    final ActivityStack as = dc.getStackAt(i);
                    if (as.getTile() == container) {
                    if (as.getTile() == container) {
                        if (activityTypes != null
                                && !ArrayUtils.contains(activityTypes, as.getActivityType())) {
                            continue;
                        }
                        final RunningTaskInfo info = new RunningTaskInfo();
                        final RunningTaskInfo info = new RunningTaskInfo();
                        as.fillTaskInfo(info);
                        as.fillTaskInfo(info);
                        out.add(info);
                        out.add(info);
@@ -417,6 +423,40 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub
        }
        }
    }
    }


    @Override
    public List<RunningTaskInfo> getRootTasks(int displayId, @Nullable int[] activityTypes) {
        enforceStackPermission("getRootTasks()");
        final long ident = Binder.clearCallingIdentity();
        try {
            synchronized (mGlobalLock) {
                final DisplayContent dc =
                        mService.mRootWindowContainer.getDisplayContent(displayId);
                if (dc == null) {
                    throw new IllegalArgumentException("Display " + displayId + " doesn't exist");
                }
                ArrayList<RunningTaskInfo> out = new ArrayList<>();
                for (int i = dc.getStackCount() - 1; i >= 0; --i) {
                    final ActivityStack task = dc.getStackAt(i);
                    if (task.getTile() != null) {
                        // a tile is supposed to look like a parent, so don't include their
                        // "children" here. They can be accessed via getChildTasks()
                        continue;
                    }
                    if (activityTypes != null
                            && !ArrayUtils.contains(activityTypes, task.getActivityType())) {
                        continue;
                    }
                    final RunningTaskInfo info = new RunningTaskInfo();
                    task.fillTaskInfo(info);
                    out.add(info);
                }
                return out;
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    private int sanitizeAndApplyChange(WindowContainer container,
    private int sanitizeAndApplyChange(WindowContainer container,
            WindowContainerTransaction.Change change) {
            WindowContainerTransaction.Change change) {
        if (!(container instanceof Task)) {
        if (!(container instanceof Task)) {
+17 −2
Original line number Original line Diff line number Diff line
@@ -393,11 +393,19 @@ public class TaskOrganizerTests extends WindowTestsBase {
        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
        RunningTaskInfo info2 = mWm.mAtmService.mTaskOrganizerController.createRootTask(
                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
                mDisplayContent.mDisplayId, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);


        final int initialRootTaskCount = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
                mDisplayContent.mDisplayId, null /* activityTypes */).size();

        final ActivityStack stack = createTaskStackOnDisplay(
        final ActivityStack stack = createTaskStackOnDisplay(
                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD, mDisplayContent);
        final ActivityStack stack2 = createTaskStackOnDisplay(
        final ActivityStack stack2 = createTaskStackOnDisplay(
                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);
                WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, mDisplayContent);


        // Check getRootTasks works
        List<RunningTaskInfo> roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(
                mDisplayContent.mDisplayId, null /* activityTypes */);
        assertEquals(initialRootTaskCount + 2, roots.size());

        lastReportedTiles.clear();
        lastReportedTiles.clear();
        WindowContainerTransaction wct = new WindowContainerTransaction();
        WindowContainerTransaction wct = new WindowContainerTransaction();
        wct.reparent(stack.mRemoteToken, info1.token, true /* onTop */);
        wct.reparent(stack.mRemoteToken, info1.token, true /* onTop */);
@@ -424,11 +432,18 @@ public class TaskOrganizerTests extends WindowTestsBase {


        // Check the getChildren call
        // Check the getChildren call
        List<RunningTaskInfo> children =
        List<RunningTaskInfo> children =
                mWm.mAtmService.mTaskOrganizerController.getChildTasks(info1.token);
                mWm.mAtmService.mTaskOrganizerController.getChildTasks(info1.token,
                        null /* activityTypes */);
        assertEquals(2, children.size());
        assertEquals(2, children.size());
        children = mWm.mAtmService.mTaskOrganizerController.getChildTasks(info2.token);
        children = mWm.mAtmService.mTaskOrganizerController.getChildTasks(info2.token,
                null /* activityTypes */);
        assertEquals(0, children.size());
        assertEquals(0, children.size());


        // Check that getRootTasks doesn't include children of tiles
        roots = mWm.mAtmService.mTaskOrganizerController.getRootTasks(mDisplayContent.mDisplayId,
                null /* activityTypes */);
        assertEquals(initialRootTaskCount, roots.size());

        lastReportedTiles.clear();
        lastReportedTiles.clear();
        wct = new WindowContainerTransaction();
        wct = new WindowContainerTransaction();
        wct.reorder(stack2.mRemoteToken, true /* onTop */);
        wct.reorder(stack2.mRemoteToken, true /* onTop */);