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

Commit d95f59d6 authored by Wale Ogunwale's avatar Wale Ogunwale Committed by Android (Google) Code Review
Browse files

Merge "Remove root window hierarchy logic from ActivityStackSupervior (40/n)"

parents 57ae24c6 d32da477
Loading
Loading
Loading
Loading
+43 −39
Original line number Diff line number Diff line
@@ -39,8 +39,6 @@ import static com.android.server.am.ActivityDisplayProto.ID;
import static com.android.server.am.ActivityDisplayProto.RESUMED_ACTIVITY;
import static com.android.server.am.ActivityDisplayProto.STACKS;
import static com.android.server.wm.ActivityStack.ActivityState.RESUMED;
import static com.android.server.wm.ActivityStackSupervisor.FindTaskResult;
import static com.android.server.wm.ActivityStackSupervisor.TAG_STATES;
import static com.android.server.wm.ActivityStackSupervisor.TAG_TASKS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STACK;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STATES;
@@ -48,6 +46,8 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_STACK;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.RootActivityContainer.FindTaskResult;
import static com.android.server.wm.RootActivityContainer.TAG_STATES;

import android.annotation.Nullable;
import android.app.ActivityOptions;
@@ -84,7 +84,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
     */
    private static int sNextFreeStackId = 0;

    private ActivityStackSupervisor mSupervisor;
    private ActivityTaskManagerService mService;
    private RootActivityContainer mRootActivityContainer;
    /** Actual Display this object tracks. */
    int mDisplayId;
    Display mDisplay;
@@ -141,8 +142,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

    private final FindTaskResult mTmpFindTaskResult = new FindTaskResult();

    ActivityDisplay(ActivityStackSupervisor supervisor, Display display) {
        mSupervisor = supervisor;
    ActivityDisplay(RootActivityContainer root, Display display) {
        mRootActivityContainer = root;
        mService = root.mService;
        mDisplayId = display.getDisplayId();
        mDisplay = display;
        mWindowContainerController = createWindowContainerController();
@@ -168,7 +170,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        if (displayId != DEFAULT_DISPLAY) {
            final int displayState = mDisplay.getState();
            if (displayState == Display.STATE_OFF && mOffToken == null) {
                mOffToken = mSupervisor.mService.acquireSleepToken("Display-off", displayId);
                mOffToken = mService.acquireSleepToken("Display-off", displayId);
            } else if (displayState == Display.STATE_ON && mOffToken != null) {
                mOffToken.release();
                mOffToken = null;
@@ -189,7 +191,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
                + " to displayId=" + mDisplayId + " position=" + position);
        addStackReferenceIfNeeded(stack);
        positionChildAt(stack, position);
        mSupervisor.mService.updateSleepIfNeededLocked();
        mService.updateSleepIfNeededLocked();
    }

    void removeChild(ActivityStack stack) {
@@ -201,7 +203,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        }
        removeStackReferenceIfNeeded(stack);
        releaseSelfIfNeeded();
        mSupervisor.mService.updateSleepIfNeededLocked();
        mService.updateSleepIfNeededLocked();
        onStackOrderChanged();
    }

@@ -252,7 +254,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
            final ActivityStack currentFocusedStack = getFocusedStack();
            if (currentFocusedStack != prevFocusedStack) {
                mLastFocusedStack = prevFocusedStack;
                EventLogTags.writeAmFocusedStack(mSupervisor.mCurrentUser, mDisplayId,
                EventLogTags.writeAmFocusedStack(mRootActivityContainer.mCurrentUser, mDisplayId,
                        currentFocusedStack == null ? -1 : currentFocusedStack.getStackId(),
                        mLastFocusedStack == null ? -1 : mLastFocusedStack.getStackId(),
                        updateLastFocusedStackReason);
@@ -409,10 +411,10 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
            }
        }

        final ActivityTaskManagerService service = mSupervisor.mService;
        if (!isWindowingModeSupported(windowingMode, service.mSupportsMultiWindow,
                service.mSupportsSplitScreenMultiWindow, service.mSupportsFreeformWindowManagement,
                service.mSupportsPictureInPicture, activityType)) {
        if (!isWindowingModeSupported(windowingMode, mService.mSupportsMultiWindow,
                mService.mSupportsSplitScreenMultiWindow,
                mService.mSupportsFreeformWindowManagement, mService.mSupportsPictureInPicture,
                activityType)) {
            throw new IllegalArgumentException("Can't create stack for unsupported windowingMode="
                    + windowingMode);
        }
@@ -425,10 +427,12 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
    <T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
            int stackId, boolean onTop) {
        if (windowingMode == WINDOWING_MODE_PINNED) {
            return (T) new PinnedActivityStack(this, stackId, mSupervisor, onTop);
            return (T) new PinnedActivityStack(this, stackId,
                    mRootActivityContainer.mStackSupervisor, onTop);
        }
        return (T) new ActivityStack(
                        this, stackId, mSupervisor, windowingMode, activityType, onTop);
        return (T) new ActivityStack(this, stackId,
                mRootActivityContainer.mStackSupervisor, windowingMode, activityType,
                onTop);
    }

    /**
@@ -543,7 +547,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
            final ActivityStack stack = mStacks.get(stackNdx);
            // TODO(b/111541062): Check if resumed activity on this display instead
            if (!mSupervisor.isTopDisplayFocusedStack(stack)
            if (!mRootActivityContainer.isTopDisplayFocusedStack(stack)
                    && stack.getResumedActivity() != null) {
                if (DEBUG_STATES) Slog.d(TAG_STATES, "pauseBackStacks: stack=" + stack +
                        " mResumedActivity=" + stack.getResumedActivity());
@@ -608,7 +612,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
                if (stack.getWindowingMode() != windowingMode) {
                    continue;
                }
                mSupervisor.removeStack(stack);
                mRootActivityContainer.mStackSupervisor.removeStack(stack);
            }
        }
    }
@@ -623,7 +627,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
            for (int i = mStacks.size() - 1; i >= 0; --i) {
                final ActivityStack stack = mStacks.get(i);
                if (stack.getActivityType() == activityType) {
                    mSupervisor.removeStack(stack);
                    mRootActivityContainer.mStackSupervisor.removeStack(stack);
                }
            }
        }
@@ -685,7 +689,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
    }

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

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

@@ -824,11 +828,10 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
    int validateWindowingMode(int windowingMode, @Nullable ActivityRecord r,
        @Nullable TaskRecord task, int activityType) {
        // Make sure the windowing mode we are trying to use makes sense for what is supported.
        final ActivityTaskManagerService service = mSupervisor.mService;
        boolean supportsMultiWindow = service.mSupportsMultiWindow;
        boolean supportsSplitScreen = service.mSupportsSplitScreenMultiWindow;
        boolean supportsFreeform = service.mSupportsFreeformWindowManagement;
        boolean supportsPip = service.mSupportsPictureInPicture;
        boolean supportsMultiWindow = mService.mSupportsMultiWindow;
        boolean supportsSplitScreen = mService.mSupportsSplitScreenMultiWindow;
        boolean supportsFreeform = mService.mSupportsFreeformWindowManagement;
        boolean supportsPip = mService.mSupportsPictureInPicture;
        if (supportsMultiWindow) {
            if (task != null) {
                supportsMultiWindow = task.isResizeable();
@@ -932,7 +935,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        // This activity can be considered the top running activity if we are not considering
        // the locked state, the keyguard isn't locked, or we can show when locked.
        if (topRunning != null && considerKeyguardState
                && mSupervisor.getKeyguardController().isKeyguardLocked()
                && mRootActivityContainer.mStackSupervisor.getKeyguardController().isKeyguardLocked()
                && !topRunning.canShowWhenLocked()) {
            return null;
        }
@@ -1010,7 +1013,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

    @Override
    protected ConfigurationContainer getParent() {
        return mSupervisor;
        return mRootActivityContainer;
    }

    boolean isPrivate() {
@@ -1043,8 +1046,8 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        // released (no more ActivityStack). But, we cannot release it at that moment or the
        // related WindowContainer and WindowContainerController will also be removed. So, we
        // set display as removed after reparenting stack finished.
        final ActivityDisplay toDisplay = mSupervisor.getDefaultDisplay();
        mSupervisor.beginDeferResume();
        final ActivityDisplay toDisplay = mRootActivityContainer.getDefaultDisplay();
        mRootActivityContainer.mStackSupervisor.beginDeferResume();
        try {
            int numStacks = mStacks.size();
            // Keep the order from bottom to top.
@@ -1070,7 +1073,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
                numStacks = mStacks.size();
            }
        } finally {
            mSupervisor.endDeferResume();
            mRootActivityContainer.mStackSupervisor.endDeferResume();
        }
        mRemoved = true;

@@ -1082,9 +1085,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        releaseSelfIfNeeded();

        if (!mAllSleepTokens.isEmpty()) {
            mSupervisor.mSleepTokens.removeAll(mAllSleepTokens);
            mRootActivityContainer.mSleepTokens.removeAll(mAllSleepTokens);
            mAllSleepTokens.clear();
            mSupervisor.mService.updateSleepIfNeededLocked();
            mService.updateSleepIfNeededLocked();
        }
    }

@@ -1092,8 +1095,9 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
        if (mStacks.isEmpty() && mRemoved) {
            mWindowContainerController.removeContainer();
            mWindowContainerController = null;
            mSupervisor.removeChild(this);
            mSupervisor.getKeyguardController().onDisplayRemoved(mDisplayId);
            mRootActivityContainer.removeChild(this);
            mRootActivityContainer.mStackSupervisor
                    .getKeyguardController().onDisplayRemoved(mDisplayId);
        }
    }

@@ -1122,7 +1126,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

    boolean shouldSleep() {
        return (mStacks.isEmpty() || !mAllSleepTokens.isEmpty())
                && (mSupervisor.mService.mRunningVoice == null);
                && (mService.mRunningVoice == null);
    }

    void setFocusedApp(ActivityRecord r, boolean moveFocusNow) {
@@ -1213,7 +1217,7 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

    @Nullable
    ActivityRecord getHomeActivity() {
        return getHomeActivityForUser(mSupervisor.mCurrentUser);
        return getHomeActivityForUser(mRootActivityContainer.mCurrentUser);
    }

    @Nullable
+3 −2
Original line number Diff line number Diff line
@@ -277,7 +277,8 @@ class ActivityMetricsLogger {
        mLastLogTimeSecs = now;

        mWindowState = WINDOW_STATE_INVALID;
        ActivityStack stack = mSupervisor.getTopDisplayFocusedStack();
        ActivityStack stack =
                mSupervisor.mRootActivityContainer.getTopDisplayFocusedStack();
        if (stack == null) {
            return;
        }
@@ -289,7 +290,7 @@ class ActivityMetricsLogger {

        @WindowingMode int windowingMode = stack.getWindowingMode();
        if (windowingMode == WINDOWING_MODE_PINNED) {
            stack = mSupervisor.findStackBehind(stack);
            stack = mSupervisor.mRootActivityContainer.findStackBehind(stack);
            windowingMode = stack.getWindowingMode();
        }
        switch (windowingMode) {
+12 −10
Original line number Diff line number Diff line
@@ -322,6 +322,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo

    private boolean inHistory;  // are we in the history stack?
    final ActivityStackSupervisor mStackSupervisor;
    final RootActivityContainer mRootActivityContainer;

    static final int STARTING_WINDOW_NOT_SHOWN = 0;
    static final int STARTING_WINDOW_SHOWN = 1;
@@ -844,6 +845,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
            boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,
            ActivityOptions options, ActivityRecord sourceRecord) {
        service = _service;
        mRootActivityContainer = _service.mRootActivityContainer;
        appToken = new Token(this, _intent);
        info = aInfo;
        launchedFromPid = _launchedFromPid;
@@ -1200,7 +1202,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    }

    boolean isFocusable() {
        return mStackSupervisor.isFocusable(this, isAlwaysFocusable());
        return mRootActivityContainer.isFocusable(this, isAlwaysFocusable());
    }

    boolean isResizeable() {
@@ -1353,7 +1355,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
            return false;
        }

        if (mStackSupervisor.getTopResumedActivity() == this) {
        if (mRootActivityContainer.getTopResumedActivity() == this) {
            if (DEBUG_FOCUS) {
                Slog.d(TAG_FOCUS, "moveActivityStackToFront: already on top, activity=" + this);
            }
@@ -1366,7 +1368,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo

        stack.moveToFront(reason, task);
        // Report top activity change to tracking services and WM
        if (mStackSupervisor.getTopResumedActivity() == this) {
        if (mRootActivityContainer.getTopResumedActivity() == this) {
            // TODO(b/111361570): Support multiple focused apps in WM
            service.setResumedActivityUncheckLocked(this, reason);
        }
@@ -1864,9 +1866,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
            } else {
                if (deferRelaunchUntilPaused) {
                    stack.destroyActivityLocked(this, true /* removeFromApp */, "stop-config");
                    mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
                    mRootActivityContainer.resumeFocusedStacksTopActivities();
                } else {
                    mStackSupervisor.updatePreviousProcessLocked(this);
                    mRootActivityContainer.updatePreviousProcess(this);
                }
            }
        }
@@ -2036,7 +2038,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
        // another activity to start or has stopped, then the key dispatching
        // timeout should not be caused by this.
        if (mStackSupervisor.mActivitiesWaitingForVisibleActivity.contains(this) || stopped) {
            final ActivityStack stack = mStackSupervisor.getTopDisplayFocusedStack();
            final ActivityStack stack = mRootActivityContainer.getTopDisplayFocusedStack();
            // Try to use the one which is closest to top.
            ActivityRecord r = stack.getResumedActivity();
            if (r == null) {
@@ -2224,7 +2226,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    void setRequestedOrientation(int requestedOrientation) {
        final int displayId = getDisplayId();
        final Configuration displayConfig =
                mStackSupervisor.getDisplayOverrideConfiguration(displayId);
                mRootActivityContainer.getDisplayOverrideConfiguration(displayId);

        final Configuration config = mWindowContainerController.setOrientation(requestedOrientation,
                displayId, displayConfig, mayFreezeScreenLocked(app));
@@ -2232,7 +2234,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
            frozenBeforeDestroy = true;
            if (!service.updateDisplayOverrideConfigurationLocked(config, this,
                    false /* deferResume */, displayId)) {
                mStackSupervisor.resumeFocusedStacksTopActivitiesLocked();
                mRootActivityContainer.resumeFocusedStacksTopActivities();
            }
        }
        service.getTaskChangeNotificationController().notifyActivityRequestedOrientationChanged(
@@ -2867,7 +2869,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo

    void setShowWhenLocked(boolean showWhenLocked) {
        mShowWhenLocked = showWhenLocked;
        mStackSupervisor.ensureActivitiesVisibleLocked(null, 0 /* configChanges */,
        mRootActivityContainer.ensureActivitiesVisible(null, 0 /* configChanges */,
                false /* preserveWindows */);
    }

@@ -2905,7 +2907,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    }

    boolean isTopRunningActivity() {
        return mStackSupervisor.topRunningActivityLocked() == this;
        return mRootActivityContainer.topRunningActivity() == this;
    }

    /**
+50 −59

File changed.

Preview size limit exceeded, changes collapsed.

+79 −2333

File changed.

Preview size limit exceeded, changes collapsed.

Loading