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

Commit dddb71b7 authored by Tiger Huang's avatar Tiger Huang Committed by Automerger Merge Worker
Browse files

Merge "Let the client compute the backdrop frame on its own" into tm-dev am: 630c25dd

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17254790

Change-Id: Ibde3bcb08b937ff8a7f64a068166a8972fa5cf16
parents 9168e889 630c25dd
Loading
Loading
Loading
Loading
+31 −41
Original line number Diff line number Diff line
@@ -401,10 +401,8 @@ public final class ViewRootImpl implements ViewParent,
    private static boolean sAlwaysAssignFocus;

    /**
     * This list must only be modified by the main thread, so a lock is only needed when changing
     * the list or when accessing the list from a non-main thread.
     * This list must only be modified by the main thread.
     */
    @GuardedBy("mWindowCallbacks")
    final ArrayList<WindowCallbacks> mWindowCallbacks = new ArrayList<>();
    @UnsupportedAppUsage
    @UiContext
@@ -973,16 +971,12 @@ public final class ViewRootImpl implements ViewParent,
    }

    public void addWindowCallbacks(WindowCallbacks callback) {
        synchronized (mWindowCallbacks) {
        mWindowCallbacks.add(callback);
    }
    }

    public void removeWindowCallbacks(WindowCallbacks callback) {
        synchronized (mWindowCallbacks) {
        mWindowCallbacks.remove(callback);
    }
    }

    public void reportDrawFinish() {
        if (mWindowDrawCountDown != null) {
@@ -1703,15 +1697,19 @@ public final class ViewRootImpl implements ViewParent,
        final boolean forceNextWindowRelayout = args.argi1 != 0;
        final int displayId = args.argi3;
        final int resizeMode = args.argi5;
        final Rect backdropFrame = frames.backdropFrame;

        final boolean frameChanged = !mWinFrame.equals(frames.frame);
        final boolean backdropFrameChanged = !mPendingBackDropFrame.equals(backdropFrame);
        final Rect frame = frames.frame;
        final Rect displayFrame = frames.displayFrame;
        if (mTranslator != null) {
            mTranslator.translateRectInScreenToAppWindow(frame);
            mTranslator.translateRectInScreenToAppWindow(displayFrame);
        }
        final boolean frameChanged = !mWinFrame.equals(frame);
        final boolean configChanged = !mLastReportedMergedConfiguration.equals(mergedConfiguration);
        final boolean displayChanged = mDisplay.getDisplayId() != displayId;
        final boolean resizeModeChanged = mResizeMode != resizeMode;
        if (msg == MSG_RESIZED && !frameChanged && !backdropFrameChanged && !configChanged
                && !displayChanged && !resizeModeChanged && !forceNextWindowRelayout) {
        if (msg == MSG_RESIZED && !frameChanged && !configChanged && !displayChanged
                && !resizeModeChanged && !forceNextWindowRelayout) {
            return;
        }

@@ -1727,9 +1725,17 @@ public final class ViewRootImpl implements ViewParent,
            onMovedToDisplay(displayId, mLastConfigurationFromResources);
        }

        setFrame(frames.frame);
        mTmpFrames.displayFrame.set(frames.displayFrame);
        mPendingBackDropFrame.set(backdropFrame);
        setFrame(frame);
        mTmpFrames.displayFrame.set(displayFrame);

        if (mDragResizing && mUseMTRenderer) {
            boolean fullscreen = frame.equals(mPendingBackDropFrame);
            for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) {
                mWindowCallbacks.get(i).onWindowSizeIsChanging(mPendingBackDropFrame, fullscreen,
                        mAttachInfo.mVisibleInsets, mAttachInfo.mStableInsets);
            }
        }

        mForceNextWindowRelayout = forceNextWindowRelayout;
        mPendingAlwaysConsumeSystemBars = args.argi2 != 0;
        mSyncSeqId = args.argi4;
@@ -5619,8 +5625,6 @@ public final class ViewRootImpl implements ViewParent,
                        mTmpFrames.frame.top = t;
                        mTmpFrames.frame.bottom = t + h;
                        setFrame(mTmpFrames.frame);

                        mPendingBackDropFrame.set(mWinFrame);
                        maybeHandleWindowMove(mWinFrame);
                    }
                    break;
@@ -8118,7 +8122,6 @@ public final class ViewRootImpl implements ViewParent,
                    getConfiguration().windowConfiguration.getBounds());
        }

        mPendingBackDropFrame.set(mTmpFrames.backdropFrame);
        if (mSurfaceControl.isValid()) {
            if (!useBLAST()) {
                mSurface.copyFrom(mSurfaceControl);
@@ -8149,6 +8152,7 @@ public final class ViewRootImpl implements ViewParent,

        if (mTranslator != null) {
            mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame);
            mTranslator.translateRectInScreenToAppWindow(mTmpFrames.displayFrame);
            mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets);
            mTranslator.translateSourceControlsInScreenToAppWindow(mTempControls);
        }
@@ -8193,6 +8197,13 @@ public final class ViewRootImpl implements ViewParent,

    private void setFrame(Rect frame) {
        mWinFrame.set(frame);

        // Surface position is now inherited from parent, and BackdropFrameRenderer uses backdrop
        // frame to position content. Thus, we just keep the size of backdrop frame, and remove the
        // offset to avoid double offset from display origin.
        mPendingBackDropFrame.set(frame);
        mPendingBackDropFrame.offsetTo(0, 0);

        mInsetsController.onFrameChanged(mOverrideInsetsFrame != null ?
            mOverrideInsetsFrame : frame);
    }
@@ -8584,28 +8595,7 @@ public final class ViewRootImpl implements ViewParent,
    private void dispatchResized(ClientWindowFrames frames, boolean reportDraw,
            MergedConfiguration mergedConfiguration, boolean forceLayout,
            boolean alwaysConsumeSystemBars, int displayId, int seqId, int resizeMode) {
        final Rect frame = frames.frame;
        final Rect backDropFrame = frames.backdropFrame;
        if (DEBUG_LAYOUT) Log.v(mTag, "Resizing " + this + ": frame=" + frame.toShortString()
                + " reportDraw=" + reportDraw
                + " backDropFrame=" + backDropFrame);

        // Tell all listeners that we are resizing the window so that the chrome can get
        // updated as fast as possible on a separate thread,
        if (mDragResizing && mUseMTRenderer) {
            boolean fullscreen = frame.equals(backDropFrame);
            synchronized (mWindowCallbacks) {
                for (int i = mWindowCallbacks.size() - 1; i >= 0; i--) {
                    mWindowCallbacks.get(i).onWindowSizeIsChanging(backDropFrame, fullscreen,
                            mAttachInfo.mVisibleInsets, mAttachInfo.mStableInsets);
                }
            }
        }

        Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT : MSG_RESIZED);
        if (mTranslator != null) {
            mTranslator.translateRectInScreenToAppWindow(frame);
        }
        SomeArgs args = SomeArgs.obtain();
        final boolean sameProcessCall = (Binder.getCallingPid() == android.os.Process.myPid());
        args.arg1 = sameProcessCall ? new ClientWindowFrames(frames) : frames;
+0 −7
Original line number Diff line number Diff line
@@ -40,9 +40,6 @@ public class ClientWindowFrames implements Parcelable {
     */
    public final @NonNull Rect parentFrame = new Rect();

    /** The background area while the window is resizing. */
    public final @NonNull Rect backdropFrame = new Rect();

    public boolean isParentFrameClippedByDisplayCutout;

    public ClientWindowFrames() {
@@ -52,7 +49,6 @@ public class ClientWindowFrames implements Parcelable {
        frame.set(other.frame);
        displayFrame.set(other.displayFrame);
        parentFrame.set(other.parentFrame);
        backdropFrame.set(other.backdropFrame);
        isParentFrameClippedByDisplayCutout = other.isParentFrameClippedByDisplayCutout;
    }

@@ -65,7 +61,6 @@ public class ClientWindowFrames implements Parcelable {
        frame.readFromParcel(in);
        displayFrame.readFromParcel(in);
        parentFrame.readFromParcel(in);
        backdropFrame.readFromParcel(in);
        isParentFrameClippedByDisplayCutout = in.readBoolean();
    }

@@ -74,7 +69,6 @@ public class ClientWindowFrames implements Parcelable {
        frame.writeToParcel(dest, flags);
        displayFrame.writeToParcel(dest, flags);
        parentFrame.writeToParcel(dest, flags);
        backdropFrame.writeToParcel(dest, flags);
        dest.writeBoolean(isParentFrameClippedByDisplayCutout);
    }

@@ -84,7 +78,6 @@ public class ClientWindowFrames implements Parcelable {
        return "ClientWindowFrames{frame=" + frame.toShortString(sb)
                + " display=" + displayFrame.toShortString(sb)
                + " parentFrame=" + parentFrame.toShortString(sb)
                + " backdrop=" + backdropFrame.toShortString(sb)
                + " parentClippedByDisplayCutout=" + isParentFrameClippedByDisplayCutout + "}";
    }

+0 −19
Original line number Diff line number Diff line
@@ -3869,25 +3869,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
            outFrames.displayFrame.scale(mInvGlobalScale);
        }

        final Rect backdropFrame = outFrames.backdropFrame;
        // When the task is docked, we send fullscreen sized backdropFrame as soon as resizing
        // start even if we haven't received the relayout window, so that the client requests
        // the relayout sooner. When dragging stops, backdropFrame needs to stay fullscreen
        // until the window to small size, otherwise the multithread renderer will shift last
        // one or more frame to wrong offset. So here we send fullscreen backdrop if either
        // isDragResizing() or isDragResizeChanged() is true.
        final boolean resizing = isDragResizing() || isDragResizeChanged();
        if (!resizing || getWindowConfiguration().useWindowFrameForBackdrop()) {
            // Surface position is now inherited from parent, and BackdropFrameRenderer uses
            // backdrop frame to position content. Thus we just keep the size of backdrop frame,
            // and remove the offset to avoid double offset from display origin.
            backdropFrame.set(outFrames.frame);
            backdropFrame.offsetTo(0, 0);
        } else {
            final DisplayInfo displayInfo = getDisplayInfo();
            backdropFrame.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight);
        }

        // Note: in the cases where the window is tied to an activity, we should not send a
        // configuration update when the window has requested to be hidden. Doing so can lead to
        // the client erroneously accepting a configuration that would have otherwise caused an