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

Commit 86cb7ded authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Simplify getting top display focused stack

Change the container of ActivityDisplay to a list sorted by
z-order. The list will be updated when moving window container
with its parent that includes display to top or bottom.

Count the total time of calling getTopDisplayFocusedStack
until boot complete broadcast is done (about 4500 times):
  Original: 447 ms
  New     : 116 ms (include the update time)

Bug: 112531182
Test: atest FrameworksServicesTests:ActivityStackSupervisorTests
Test: atest WindowManagerSmokeTest
Test: atest ActivityManagerMultiDisplayTests

Change-Id: I42e9fc61916d0513d3e7b340fd528bc4f560fd45
parent 589ce41d
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -138,6 +138,10 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        return new DisplayWindowController(mDisplay, this);
    }

    DisplayWindowController getWindowContainerController() {
        return mWindowContainerController;
    }

    void updateBounds() {
        mDisplay.getSize(mTmpDisplaySize);
        setBounds(0, 0, mTmpDisplaySize.x, mTmpDisplaySize.y);
@@ -837,7 +841,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        if (mStacks.isEmpty() && mRemoved) {
            mWindowContainerController.removeContainer();
            mWindowContainerController = null;
            mSupervisor.releaseActivityDisplayLocked(mDisplayId);
            mSupervisor.removeChild(this);
        }
    }

+10 −10
Original line number Diff line number Diff line
@@ -775,6 +775,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                true /* includingParents */);
    }

    void positionChildWindowContainerAtBottom(TaskRecord child) {
        mWindowContainerController.positionChildAtBottom(child.getWindowContainerController(),
                true /* includingParents */);
    }

    /**
     * Returns whether to defer the scheduling of the multi-window mode.
     */
@@ -2859,8 +2864,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        final int position = getAdjustedPositionForTask(task, mTaskHistory.size(), starting);
        mTaskHistory.add(position, task);
        updateTaskMovement(task, true);
        mWindowContainerController.positionChildAtTop(task.getWindowContainerController(),
                true /* includingParents */);
        positionChildWindowContainerAtTop(task);
    }

    private void insertTaskAtBottom(TaskRecord task) {
@@ -2869,8 +2873,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        final int position = getAdjustedPositionForTask(task, 0, null);
        mTaskHistory.add(position, task);
        updateTaskMovement(task, true);
        mWindowContainerController.positionChildAtBottom(task.getWindowContainerController(),
                true /* includingParents */);
        positionChildWindowContainerAtBottom(task);
    }

    void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
@@ -3141,8 +3144,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                    p.reparent(targetTask, 0 /* position - bottom */, "resetTargetTaskIfNeeded");
                }

                mWindowContainerController.positionChildAtBottom(
                        targetTask.getWindowContainerController(), false /* includingParents */);
                positionChildWindowContainerAtBottom(targetTask);
                replyChainEnd = -1;
            } else if (forceReset || finishOnTaskLaunch || clearWhenTaskReset) {
                // If the activity should just be removed -- either
@@ -3277,8 +3279,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                        if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Pulling activity " + p
                                + " from " + srcPos + " in to resetting task " + task);
                    }
                    mWindowContainerController.positionChildAtTop(
                            task.getWindowContainerController(), true /* includingParents */);
                    positionChildWindowContainerAtTop(task);

                    // Now we've moved it in to place...  but what if this is
                    // a singleTop activity and we have put it on top of another
@@ -5239,8 +5240,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
        addTask(task, toTop ? MAX_VALUE : 0, true /* schedulePictureInPictureModeChange */, reason);
        if (toTop) {
            // TODO: figure-out a way to remove this call.
            mWindowContainerController.positionChildAtTop(task.getWindowContainerController(),
                    true /* includingParents */);
            positionChildWindowContainerAtTop(task);
        }
    }

+146 −137

File changed.

Preview size limit exceeded, changes collapsed.

+2 −6
Original line number Diff line number Diff line
@@ -16,13 +16,9 @@

package com.android.server.am;

import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;

import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration.ActivityType;
import android.app.WindowConfiguration.WindowingMode;
import android.util.SparseArray;

import java.util.ArrayList;
import java.util.Comparator;
@@ -45,7 +41,7 @@ class RunningTasks {
    private final ArrayList<TaskRecord> mTmpStackTasks = new ArrayList<>();

    void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
            @WindowingMode int ignoreWindowingMode, SparseArray<ActivityDisplay> activityDisplays,
            @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
            int callingUid, boolean allowed) {
        // Return early if there are no tasks to fetch
        if (maxNum <= 0) {
@@ -56,7 +52,7 @@ class RunningTasks {
        mTmpSortedSet.clear();
        final int numDisplays = activityDisplays.size();
        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
            final ActivityDisplay display = activityDisplays.valueAt(displayNdx);
            final ActivityDisplay display = activityDisplays.get(displayNdx);
            for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
                final ActivityStack stack = display.getChildAt(stackNdx);
                mTmpStackTasks.clear();
+5 −0
Original line number Diff line number Diff line
@@ -920,6 +920,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        appToken.onRemovedFromDisplay();
    }

    @Override
    DisplayWindowController getController() {
        return (DisplayWindowController) super.getController();
    }

    @Override
    public Display getDisplay() {
        return mDisplay;
Loading