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

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

Clean up access of display content

- ActivityRecord and Task get their own display instead of from
  parent. Because the hierarchy should guarantee the display
  instances are the same.
- Remove redundant getDisplay().mDisplayContent since there is
  no ActivityDisplay after hierarchy unifying.
- Access mDisplayContent directly because WindowContainer#reparent,
  setParent, onDisplayChanged never pass null DisplayContent.
  Currently the only place that clears mDisplayContent is in
  Task#onParentChanged. So the nullity check of mDisplayContent
  only exists in Task or other level's onConfigurationChanged if it
  is called the first time when adding to parent without display.
- The best practice of handling non-attached container might be
  to check at upper entry, e.g. ActivityRecord.isInStackLocked, or
  use WindowContainer#isAttached. Instead of checking the nullity of
  display content everywhere.

Bug: 163976519
Test: WmTests
Change-Id: Ibf6c1368cfeadcad63ad5040a6166d654b906275
parent 664cae5d
Loading
Loading
Loading
Loading
+12 −22
Original line number Diff line number Diff line
@@ -2122,11 +2122,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        return task != null ? task.getRootTaskId() : INVALID_TASK_ID;
    }

    DisplayContent getDisplay() {
        final Task stack = getRootTask();
        return stack != null ? stack.getDisplay() : null;
    }

    @Override
    @Nullable
    TaskDisplayArea getDisplayArea() {
@@ -2386,7 +2381,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A

            }
        }
        return (canReceiveKeys() || isAlwaysFocusable()) && getDisplay() != null;
        // Check isAttached() because the method may be called when removing this activity from
        // display, and WindowContainer#compareTo will throw exception if it doesn't have a parent
        // when updating focused window from DisplayContent#findFocusedWindow.
        return (canReceiveKeys() || isAlwaysFocusable()) && isAttached();
    }

    /**
@@ -2663,7 +2661,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    }

    private void prepareActivityHideTransitionAnimation(int transit) {
        final DisplayContent dc = getDisplay().mDisplayContent;
        final DisplayContent dc = mDisplayContent;
        dc.prepareAppTransition(transit, false);
        setVisibility(false);
        dc.executeAppTransition();
@@ -2708,7 +2706,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            }

            if (ensureVisibility) {
                getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
                mDisplayContent.ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
                        false /* preserveWindows */, true /* notifyClients */);
            }
        }
@@ -4652,7 +4650,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }

        // Check if the activity is on a sleeping display, and if it can turn it ON.
        if (getDisplay().isSleeping()) {
        if (mDisplayContent.isSleeping()) {
            final boolean canTurnScreenOn = !mSetToSleep || canTurnScreenOn()
                    || canShowWhenLocked() || containsDismissKeyguardWindow();
            if (!canTurnScreenOn) {
@@ -4931,12 +4929,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        }
        r.setSavedState(null /* savedState */);

        final DisplayContent display = r.getDisplay();
        if (display != null) {
            display.handleActivitySizeCompatModeIfNeeded(r);
        }

        r.getDisplayContent().mUnknownAppVisibilityController.notifyAppResumedFinished(r);
        r.mDisplayContent.handleActivitySizeCompatModeIfNeeded(r);
        r.mDisplayContent.mUnknownAppVisibilityController.notifyAppResumedFinished(r);
    }

    /**
@@ -6834,7 +6828,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            onMergedOverrideConfigurationChanged();
        }

        final DisplayContent display = getDisplay();
        final DisplayContent display = mDisplayContent;
        if (display == null) {
            return;
        }
@@ -7259,7 +7253,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            final ActivityLifecycleItem lifecycleItem;
            if (andResume) {
                lifecycleItem = ResumeActivityItem.obtain(
                        getDisplay().mDisplayContent.isNextTransitionForward());
                        mDisplayContent.isNextTransitionForward());
            } else {
                lifecycleItem = PauseActivityItem.obtain();
            }
@@ -7584,11 +7578,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
     * otherwise.
     */
    boolean isFocusedActivityOnDisplay() {
        final DisplayContent display = getDisplay();
        if (display == null) {
            return false;
        }
        return display.forAllTaskDisplayAreas(taskDisplayArea ->
        return mDisplayContent.forAllTaskDisplayAreas(taskDisplayArea ->
                taskDisplayArea.getFocusedActivity() == this);
    }

+1 −1
Original line number Diff line number Diff line
@@ -837,7 +837,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
                final ClientTransaction clientTransaction = ClientTransaction.obtain(
                        proc.getThread(), r.appToken);

                final DisplayContent dc = r.getDisplay().mDisplayContent;
                final DisplayContent dc = r.mDisplayContent;
                clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                        System.identityHashCode(r), r.info,
                        // TODO: Have this take the merged configuration instead of separate global
+2 −2
Original line number Diff line number Diff line
@@ -1731,7 +1731,7 @@ class ActivityStarter {
                        0 /* configChanges */, !PRESERVE_WINDOWS);
                // Go ahead and tell window manager to execute app transition for this activity
                // since the app transition will not be triggered through the resume channel.
                mTargetStack.getDisplay().mDisplayContent.executeAppTransition();
                mTargetStack.mDisplayContent.executeAppTransition();
            } else {
                // If the target stack was not previously focusable (previous top running activity
                // on that stack was not visible) then any prior calls to move the stack to the
@@ -2481,7 +2481,7 @@ class ActivityStarter {
        // to the front if the caller is not itself in the front.
        final boolean differentTopTask;
        if (mTargetStack.getDisplayArea() == mPreferredTaskDisplayArea) {
            final Task focusStack = mTargetStack.getDisplay().getFocusedStack();
            final Task focusStack = mTargetStack.mDisplayContent.getFocusedStack();
            final ActivityRecord curTop = (focusStack == null)
                    ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);
            final Task topTask = curTop != null ? curTop.getTask() : null;
+7 −9
Original line number Diff line number Diff line
@@ -2025,7 +2025,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

            if (self.isState(
                    Task.ActivityState.RESUMED, Task.ActivityState.PAUSING)) {
                self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition(
                self.mDisplayContent.mAppTransition.overridePendingAppTransition(
                        packageName, enterAnim, exitAnim, null, null);
            }

@@ -2409,7 +2409,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

                } else {
                    stack.setWindowingMode(windowingMode);
                    stack.getDisplay().ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS,
                    stack.mDisplayContent.ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS,
                            true /* notifyClients */);
                }
                return true;
@@ -4176,7 +4176,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

        if (params.hasSetAspectRatio()
                && !mWindowManager.isValidPictureInPictureAspectRatio(
                        r.getDisplay(), params.getAspectRatio())) {
                        r.mDisplayContent, params.getAspectRatio())) {
            final float minAspectRatio = mContext.getResources().getFloat(
                    com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
            final float maxAspectRatio = mContext.getResources().getFloat(
@@ -4620,7 +4620,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
            }
            final long origId = Binder.clearCallingIdentity();
            try {
                display.mDisplayContent.registerRemoteAnimations(definition);
                display.registerRemoteAnimations(definition);
            } finally {
                Binder.restoreCallingIdentity(origId);
            }
@@ -5466,7 +5466,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        updateResumedAppTrace(r);
        mLastResumedActivity = r;

        final boolean changed = r.getDisplay().setFocusedApp(r);
        final boolean changed = r.mDisplayContent.setFocusedApp(r);
        if (changed) {
            mWindowManager.updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL,
                    true /*updateInputWindows*/);
@@ -6206,12 +6206,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

                // We might change the visibilities here, so prepare an empty app transition which
                // might be overridden later if we actually change visibilities.
                final DisplayContent displayContent =
                        mRootWindowContainer.getDisplayContent(displayId);
                if (displayContent == null) {
                final DisplayContent dc = mRootWindowContainer.getDisplayContent(displayId);
                if (dc == null) {
                    return;
                }
                final DisplayContent dc = displayContent.mDisplayContent;
                final boolean wasTransitionSet =
                        dc.mAppTransition.getAppTransition() != TRANSIT_NONE;
                if (!wasTransitionSet) {
+5 −6
Original line number Diff line number Diff line
@@ -190,7 +190,7 @@ class KeyguardController {
                    mAodShowing ? 1 : 0,
                    1 /* keyguardGoingAway */,
                    "keyguardGoingAway");
            mRootWindowContainer.getDefaultDisplay().mDisplayContent
            mRootWindowContainer.getDefaultDisplay()
                    .prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
                            false /* alwaysKeepCurrent */, convertTransitFlags(flags),
                            false /* forceOverride */);
@@ -314,7 +314,7 @@ class KeyguardController {
        if (isKeyguardLocked()) {
            mService.deferWindowLayout();
            try {
                mRootWindowContainer.getDefaultDisplay().mDisplayContent
                mRootWindowContainer.getDefaultDisplay()
                        .prepareAppTransition(resolveOccludeTransit(),
                                false /* alwaysKeepCurrent */, 0 /* flags */,
                                true /* forceOverride */);
@@ -344,8 +344,7 @@ class KeyguardController {

        // If we are about to unocclude the Keyguard, but we can dismiss it without security,
        // we immediately dismiss the Keyguard so the activity gets shown without a flicker.
        final DisplayContent dc =
                mRootWindowContainer.getDefaultDisplay().mDisplayContent;
        final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
        if (mKeyguardShowing && canDismissKeyguard()
                && dc.mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE) {
            dc.prepareAppTransition(mBeforeUnoccludeTransit, false /* alwaysKeepCurrent */,
@@ -368,7 +367,7 @@ class KeyguardController {
    }

    private int resolveOccludeTransit() {
        final DisplayContent dc = mRootWindowContainer.getDefaultDisplay().mDisplayContent;
        final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
        if (mBeforeUnoccludeTransit != TRANSIT_UNSET
                && dc.mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
                // TODO(b/113840485): Handle app transition for individual display.
@@ -485,7 +484,7 @@ class KeyguardController {
            }
            // TODO(b/123372519): isShowingDream can only works on default display.
            if (mDisplayId == DEFAULT_DISPLAY) {
                mOccluded |= mService.mRootWindowContainer.getDefaultDisplay().mDisplayContent
                mOccluded |= mService.mRootWindowContainer.getDefaultDisplay()
                        .getDisplayPolicy().isShowingDreamLw();
            }

Loading