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

Commit e9d27e58 authored by Rob Carr's avatar Rob Carr Committed by android-build-merger
Browse files

Merge \\"Only use one SurfaceControlWithBackground per AppToken.\\" into nyc-dev am: 55427a66

am: 518c3a10

Change-Id: Ibc2098a9d175645448ce99297ca6985a3acccf04
parents 57b4545f 518c3a10
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -134,6 +134,9 @@ class AppWindowToken extends WindowToken {
    boolean mAppStopped;
    boolean mAppStopped;
    int mPendingRelaunchCount;
    int mPendingRelaunchCount;


    private ArrayList<WindowSurfaceController.SurfaceControlWithBackground> mSurfaceViewBackgrounds =
        new ArrayList<WindowSurfaceController.SurfaceControlWithBackground>();

    ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
    ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
    ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
    ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();


@@ -734,6 +737,36 @@ class AppWindowToken extends WindowToken {
        service.mWindowPlacerLocked.performSurfacePlacement();
        service.mWindowPlacerLocked.performSurfacePlacement();
    }
    }


    void addSurfaceViewBackground(WindowSurfaceController.SurfaceControlWithBackground background) {
        mSurfaceViewBackgrounds.add(background);
    }

    void removeSurfaceViewBackground(WindowSurfaceController.SurfaceControlWithBackground background) {
        mSurfaceViewBackgrounds.remove(background);
        updateSurfaceViewBackgroundVisibilities();
    }

    // We use DimLayers behind SurfaceViews to prevent holes while resizing and creating.
    // However, we need to ensure one SurfaceView doesn't cover another when they are both placed
    // below the main app window (as traditionally a SurfaceView which is never drawn
    // to is totally translucent). So we look at all our SurfaceView backgrounds and only enable
    // the background for the SurfaceView with lowest Z order
    void updateSurfaceViewBackgroundVisibilities() {
        WindowSurfaceController.SurfaceControlWithBackground bottom = null;
        int bottomLayer = Integer.MAX_VALUE;
        for (int i = 0; i < mSurfaceViewBackgrounds.size(); i++) {
            WindowSurfaceController.SurfaceControlWithBackground sc = mSurfaceViewBackgrounds.get(i);
            if (sc.mVisible && sc.mLayer < bottomLayer) {
                bottomLayer = sc.mLayer;
                bottom = sc;
            }
        }
        for (int i = 0; i < mSurfaceViewBackgrounds.size(); i++) {
            WindowSurfaceController.SurfaceControlWithBackground sc = mSurfaceViewBackgrounds.get(i);
            sc.updateBackgroundVisibility(sc != bottom);
        }
    }

    @Override
    @Override
    void dump(PrintWriter pw, String prefix) {
    void dump(PrintWriter pw, String prefix) {
        super.dump(pw, prefix);
        super.dump(pw, prefix);
+31 −13
Original line number Original line Diff line number Diff line
@@ -84,9 +84,10 @@ class WindowSurfaceController {
        // to a black-out layer placed one Z-layer below the surface.
        // to a black-out layer placed one Z-layer below the surface.
        // This prevents holes to whatever app/wallpaper is underneath.
        // This prevents holes to whatever app/wallpaper is underneath.
        if (animator.mWin.isChildWindow() &&
        if (animator.mWin.isChildWindow() &&
                animator.mWin.mSubLayer < 0) {
                animator.mWin.mSubLayer < 0 &&
                animator.mWin.mAppToken != null) {
            mSurfaceControl = new SurfaceControlWithBackground(s,
            mSurfaceControl = new SurfaceControlWithBackground(s,
                    name, w, h, format, flags);
                    name, w, h, format, flags, animator.mWin.mAppToken);
        } else if (DEBUG_SURFACE_TRACE) {
        } else if (DEBUG_SURFACE_TRACE) {
            mSurfaceControl = new SurfaceTrace(
            mSurfaceControl = new SurfaceTrace(
                    s, name, w, h, format, flags);
                    s, name, w, h, format, flags);
@@ -758,18 +759,25 @@ class WindowSurfaceController {
        }
        }
    }
    }


    private static class SurfaceControlWithBackground extends SurfaceControl {
    class SurfaceControlWithBackground extends SurfaceControl {
        private SurfaceControl mBackgroundControl;
        private SurfaceControl mBackgroundControl;
        private boolean mOpaque = true;
        private boolean mOpaque = true;
        private boolean mVisible = false;
        private boolean mAppForcedInvisible = false;
        private AppWindowToken mAppToken;
        public boolean mVisible = false;
        public int mLayer = -1;


        public SurfaceControlWithBackground(SurfaceSession s,
        public SurfaceControlWithBackground(SurfaceSession s,
                       String name, int w, int h, int format, int flags)
                        String name, int w, int h, int format, int flags,
                        AppWindowToken token)
                   throws OutOfResourcesException {
                   throws OutOfResourcesException {
            super(s, name, w, h, format, flags);
            super(s, name, w, h, format, flags);
            mBackgroundControl = new SurfaceControl(s, name, w, h,
            mBackgroundControl = new SurfaceControl(s, name, w, h,
                    PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM);
                    PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM);
            mOpaque = (flags & SurfaceControl.OPAQUE) != 0;
            mOpaque = (flags & SurfaceControl.OPAQUE) != 0;
            mAppToken = token;

            mAppToken.addSurfaceViewBackground(this);
        }
        }


        @Override
        @Override
@@ -782,6 +790,10 @@ class WindowSurfaceController {
        public void setLayer(int zorder) {
        public void setLayer(int zorder) {
            super.setLayer(zorder);
            super.setLayer(zorder);
            mBackgroundControl.setLayer(zorder - 1);
            mBackgroundControl.setLayer(zorder - 1);
            if (mLayer != zorder) {
                mLayer = zorder;
                mAppToken.updateSurfaceViewBackgroundVisibilities();
            }
        }
        }


        @Override
        @Override
@@ -818,7 +830,7 @@ class WindowSurfaceController {
        public void setOpaque(boolean isOpaque) {
        public void setOpaque(boolean isOpaque) {
            super.setOpaque(isOpaque);
            super.setOpaque(isOpaque);
            mOpaque = isOpaque;
            mOpaque = isOpaque;
            updateBackgroundVisibility();
            updateBackgroundVisibility(mAppForcedInvisible);
        }
        }


        @Override
        @Override
@@ -834,22 +846,27 @@ class WindowSurfaceController {


        @Override
        @Override
        public void hide() {
        public void hide() {
            mVisible = false;
            super.hide();
            super.hide();
            updateBackgroundVisibility();
            if (mVisible) {
                mVisible = false;
                mAppToken.updateSurfaceViewBackgroundVisibilities();
            }
        }
        }


        @Override
        @Override
        public void show() {
        public void show() {
            mVisible = true;
            super.show();
            super.show();
            updateBackgroundVisibility();
            if (!mVisible) {
                mVisible = true;
                mAppToken.updateSurfaceViewBackgroundVisibilities();
            }
        }
        }


        @Override
        @Override
        public void destroy() {
        public void destroy() {
            super.destroy();
            super.destroy();
            mBackgroundControl.destroy();
            mBackgroundControl.destroy();
            mAppToken.removeSurfaceViewBackground(this);
         }
         }


        @Override
        @Override
@@ -870,8 +887,9 @@ class WindowSurfaceController {
            mBackgroundControl.deferTransactionUntil(handle, frame);
            mBackgroundControl.deferTransactionUntil(handle, frame);
        }
        }


        private void updateBackgroundVisibility() {
        void updateBackgroundVisibility(boolean forcedInvisible) {
            if (mOpaque && mVisible) {
            mAppForcedInvisible = forcedInvisible;
            if (mOpaque && mVisible && !mAppForcedInvisible) {
                mBackgroundControl.show();
                mBackgroundControl.show();
            } else {
            } else {
                mBackgroundControl.hide();
                mBackgroundControl.hide();