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

Commit a0022cd2 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Continue layout if needed

Sometimes the operations in the deferLayout~continueLayout don't
change significant states related to layout.

This reduces 1~3 times performSurfacePlacement when switching between
activities. Also reduce lots of invocations when resizing task/stack.
Bounds change isn't a layout reason from activity aspect because there
are already many invocations from relayoutWindow, finishDrawingWindow
and animate that will request traversal.

Test: go/wm-smoke
Test: Enable debug log in WindowSurfacePlacer to observe the
      invocation of performSurfacePlacement from continueLayout.
Bug: 140407614

Change-Id: I347f1fe1db676dcf320163bed0df693775b5f022
parent 7c03ce7a
Loading
Loading
Loading
Loading
+11 −16
Original line number Diff line number Diff line
@@ -740,7 +740,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
    }

    private void onSplitScreenModeDismissed() {
        mRootActivityContainer.mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            // Adjust the windowing mode of any stack in secondary split-screen to fullscreen.
            for (int i = mStacks.size() - 1; i >= 0; --i) {
@@ -764,12 +764,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
                mHomeStack.moveToFront("onSplitScreenModeDismissed");
                topFullscreenStack.moveToFront("onSplitScreenModeDismissed");
            }
            mRootActivityContainer.mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
        }
    }

    private void onSplitScreenModeActivated() {
        mRootActivityContainer.mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            // Adjust the windowing mode of any affected by split-screen to split-screen secondary.
            for (int i = mStacks.size() - 1; i >= 0; --i) {
@@ -784,7 +784,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
                        false /* creating */);
            }
        } finally {
            mRootActivityContainer.mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
        }
    }

@@ -1002,12 +1002,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        Configuration values = new Configuration();
        mDisplayContent.computeScreenConfiguration(values);

        if (mService.mWindowManager != null) {
            final Message msg = PooledLambda.obtainMessage(
        mService.mH.sendMessage(PooledLambda.obtainMessage(
                ActivityManagerInternal::updateOomLevelsForDisplay, mService.mAmInternal,
                    mDisplayId);
            mService.mH.sendMessage(msg);
        }
                mDisplayId));

        Settings.System.clearConfiguration(values);
        updateDisplayOverrideConfigurationLocked(values, null /* starting */,
@@ -1026,9 +1023,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        int changes = 0;
        boolean kept = true;

        if (mService.mWindowManager != null) {
            mService.mWindowManager.deferSurfaceLayout();
        }
        mService.deferWindowLayout();
        try {
            if (values != null) {
                if (mDisplayId == DEFAULT_DISPLAY) {
@@ -1045,9 +1040,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

            kept = mService.ensureConfigAndVisibilityAfterUpdate(starting, changes);
        } finally {
            if (mService.mWindowManager != null) {
                mService.mWindowManager.continueSurfaceLayout();
            }
            mService.continueWindowLayout();
        }

        if (result != null) {
@@ -1096,6 +1089,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
            mService.mWindowManager.setNewDisplayOverrideConfiguration(
                    overrideConfiguration, mDisplayContent);
        }
        mService.addWindowLayoutReasons(
                ActivityTaskManagerService.LAYOUT_REASON_CONFIG_CHANGED);
    }

    @Override
+4 −2
Original line number Diff line number Diff line
@@ -1703,7 +1703,7 @@ final class ActivityRecord extends ConfigurationContainer {
                // is not visible if it only contains finishing activities.
                && mRootActivityContainer.isTopDisplayFocusedStack(stack);

        mAtmService.mWindowManager.deferSurfaceLayout();
        mAtmService.deferWindowLayout();
        try {
            makeFinishingLocked();
            final TaskRecord task = getTaskRecord();
@@ -1809,7 +1809,7 @@ final class ActivityRecord extends ConfigurationContainer {

            return FINISH_RESULT_REQUESTED;
        } finally {
            mAtmService.mWindowManager.continueSurfaceLayout();
            mAtmService.continueWindowLayout();
        }
    }

@@ -2547,6 +2547,8 @@ final class ActivityRecord extends ConfigurationContainer {
            return;
        }
        mAppWindowToken.setVisibility(visible, mDeferHidingClient);
        mAtmService.addWindowLayoutReasons(
                ActivityTaskManagerService.LAYOUT_REASON_VISIBILITY_CHANGED);
        mStackSupervisor.getActivityMetricsLogger().notifyVisibilityChanged(this);
    }

+6 −7
Original line number Diff line number Diff line
@@ -757,7 +757,6 @@ class ActivityStack extends ConfigurationContainer {
            return;
        }

        final WindowManagerService wm = mService.mWindowManager;
        final ActivityRecord topActivity = getTopActivity();

        // For now, assume that the Stack's windowing mode is what will actually be used
@@ -779,7 +778,7 @@ class ActivityStack extends ConfigurationContainer {
                    topTask.taskId, FORCED_RESIZEABLE_REASON_SPLIT_SCREEN, packageName);
        }

        wm.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            if (!animate && topActivity != null) {
                mStackSupervisor.mNoAnimActivities.add(topActivity);
@@ -850,7 +849,7 @@ class ActivityStack extends ConfigurationContainer {
                // If task moved to docked stack - show recents if needed.
                mService.mWindowManager.showRecentApps();
            }
            wm.continueSurfaceLayout();
            mService.continueWindowLayout();
        }

        if (!deferEnsuringVisibility) {
@@ -1750,11 +1749,11 @@ class ActivityStack extends ConfigurationContainer {
            if (mPausingActivity == r) {
                if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r
                        + (timeout ? " (due to timeout)" : " (pause complete)"));
                mService.mWindowManager.deferSurfaceLayout();
                mService.deferWindowLayout();
                try {
                    completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
                } finally {
                    mService.mWindowManager.continueSurfaceLayout();
                    mService.continueWindowLayout();
                }
                return;
            } else {
@@ -4360,7 +4359,7 @@ class ActivityStack extends ConfigurationContainer {
        }

        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "stack.resize_" + mStackId);
        mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            // Update override configurations of all tasks in the stack.
            final Rect taskBounds = tempTaskBounds != null ? tempTaskBounds : bounds;
@@ -4384,7 +4383,7 @@ class ActivityStack extends ConfigurationContainer {
                        topRunningActivityLocked(), preserveWindows);
            }
        } finally {
            mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }
    }
+8 −9
Original line number Diff line number Diff line
@@ -1495,7 +1495,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
    private void moveTasksToFullscreenStackInSurfaceTransaction(ActivityStack fromStack,
            int toDisplayId, boolean onTop) {

        mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            final int windowingMode = fromStack.getWindowingMode();
            final boolean inPinnedWindowingMode = windowingMode == WINDOWING_MODE_PINNED;
@@ -1561,7 +1561,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
            mRootActivityContainer.resumeFocusedStacksTopActivities();
        } finally {
            mAllowDockedStackResize = true;
            mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
        }
    }

@@ -1630,7 +1630,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
        }

        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeDockedStack");
        mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            // Don't allow re-entry while resizing. E.g. due to docked stack detaching.
            mAllowDockedStackResize = false;
@@ -1694,7 +1694,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
            }
        } finally {
            mAllowDockedStackResize = true;
            mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }
    }
@@ -1718,9 +1718,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
        }

        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizePinnedStack");
        mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            ActivityRecord r = stack.topRunningActivityLocked();
            Rect insetBounds = null;
            if (tempPinnedTaskBounds != null && stack.isAnimatingBoundsToFullscreen()) {
                // Use 0,0 as the position for the inset rect because we are headed for fullscreen.
@@ -1739,7 +1738,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
            stack.resize(pinnedBounds, tempPinnedTaskBounds, insetBounds, !PRESERVE_WINDOWS,
                    !DEFER_RESUME);
        } finally {
            mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }
    }
@@ -2731,7 +2730,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
                    + taskId + " can't be launch in the home/recents stack.");
        }

        mWindowManager.deferSurfaceLayout();
        mService.deferWindowLayout();
        try {
            if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
                mWindowManager.setDockedStackCreateStateLocked(
@@ -2822,7 +2821,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
                    mWindowManager.checkSplitScreenMinimizedChanged(false /* animate */);
                }
            }
            mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
        }
    }

+2 −2
Original line number Diff line number Diff line
@@ -1400,7 +1400,7 @@ class ActivityStarter {
        int result = START_CANCELED;
        final ActivityStack startedActivityStack;
        try {
            mService.mWindowManager.deferSurfaceLayout();
            mService.deferWindowLayout();
            result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,
                    startFlags, doResume, options, inTask, outActivity, restrictedBgActivity);
        } finally {
@@ -1436,7 +1436,7 @@ class ActivityStarter {
                    startedActivityStack.remove();
                }
            }
            mService.mWindowManager.continueSurfaceLayout();
            mService.continueWindowLayout();
        }

        postStartActivityProcessing(r, result, startedActivityStack);
Loading