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

Commit a248332a authored by Rob Carr's avatar Rob Carr Committed by Automerger Merge Worker
Browse files

Merge "WM Wallpaper: Set offset and scale on WindowState level" into sc-dev am: f11c2698

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

Change-Id: I374bb7cb29ca320e91ccce3ac938f8fc464db5e6
parents 4f64c61d f11c2698
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -340,7 +340,7 @@ class WallpaperController {
            rawChanged = true;
            rawChanged = true;
        }
        }


        boolean changed = wallpaperWin.mWinAnimator.setWallpaperOffset(xOffset, yOffset,
        boolean changed = wallpaperWin.setWallpaperOffset(xOffset, yOffset,
                wallpaperWin.mShouldScaleWallpaper
                wallpaperWin.mShouldScaleWallpaper
                        ? zoomOutToScale(wallpaperWin.mWallpaperZoomOut) : 1);
                        ? zoomOutToScale(wallpaperWin.mWallpaperZoomOut) : 1);


+28 −3
Original line number Original line Diff line number Diff line
@@ -445,6 +445,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
    float mOverrideScale = 1;
    float mOverrideScale = 1;
    float mHScale=1, mVScale=1;
    float mHScale=1, mVScale=1;
    float mLastHScale=1, mLastVScale=1;
    float mLastHScale=1, mLastVScale=1;

    // An offset in pixel of the surface contents from the window position. Used for Wallpaper
    // to provide the effect of scrolling within a large surface. We just use these values as
    // a cache.
    int mXOffset = 0;
    int mYOffset = 0;

    // A scale factor for the surface contents, that will be applied from the center of the visible
    // region.
    float mWallpaperScale = 1f;

    final Matrix mTmpMatrix = new Matrix();
    final Matrix mTmpMatrix = new Matrix();
    final float[] mTmpMatrixArray = new float[9];
    final float[] mTmpMatrixArray = new float[9];


@@ -5443,10 +5454,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
    }
    }


    private void updateScaleIfNeeded() {
    private void updateScaleIfNeeded() {
        if (mLastGlobalScale != mGlobalScale || mLastHScale != mHScale ||
        float newHScale = mHScale * mGlobalScale * mWallpaperScale;
            mLastVScale != mVScale ) {
        float newVScale = mVScale * mGlobalScale * mWallpaperScale;
        if (mLastHScale != newHScale ||
            mLastVScale != newVScale ) {
            getPendingTransaction().setMatrix(getSurfaceControl(),
            getPendingTransaction().setMatrix(getSurfaceControl(),
                mGlobalScale*mHScale, 0, 0, mGlobalScale*mVScale);
                newHScale, 0, 0, newVScale);
            mLastGlobalScale = mGlobalScale;
            mLastGlobalScale = mGlobalScale;
            mLastHScale = mHScale;
            mLastHScale = mHScale;
            mLastVScale = mVScale;
            mLastVScale = mVScale;
@@ -5484,6 +5497,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
        mSurfacePlacementNeeded = false;
        mSurfacePlacementNeeded = false;
        transformFrameToSurfacePosition(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top,
        transformFrameToSurfacePosition(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top,
                mSurfacePosition);
                mSurfacePosition);
        mSurfacePosition.offset(mXOffset, mYOffset);


        // Freeze position while we're unrotated, so the surface remains at the position it was
        // Freeze position while we're unrotated, so the surface remains at the position it was
        // prior to the rotation.
        // prior to the rotation.
@@ -6096,4 +6110,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
    void markRedrawForSyncReported() {
    void markRedrawForSyncReported() {
       mRedrawForSyncReported = true;
       mRedrawForSyncReported = true;
    }
    }

    boolean setWallpaperOffset(int dx, int dy, float scale) {
        if (mXOffset == dx && mYOffset == dy && Float.compare(mWallpaperScale, scale) == 0) {
            return false;
        }
        mXOffset = dx;
        mYOffset = dy;
        mWallpaperScale = scale;
        scheduleAnimation();
        return true;
    }
}
}
+2 −77
Original line number Original line Diff line number Diff line
@@ -169,16 +169,6 @@ class WindowStateAnimator {


    int mAttrType;
    int mAttrType;


    // An offset in pixel of the surface contents from the window position. Used for Wallpaper
    // to provide the effect of scrolling within a large surface. We just use these values as
    // a cache.
    int mXOffset = 0;
    int mYOffset = 0;

    // A scale factor for the surface contents, that will be applied from the center of the visible
    // region.
    float mWallpaperScale = 1f;

    private final Rect mTmpSize = new Rect();
    private final Rect mTmpSize = new Rect();


    /**
    /**
@@ -502,18 +492,6 @@ class WindowStateAnimator {
        }
        }


        final WindowState w = mWin;
        final WindowState w = mWin;

        if (!w.mSeamlesslyRotated) {
            // Used to offset the WSA when stack position changes before a resize.
            int xOffset = mXOffset;
            int yOffset = mYOffset;
            if (!mIsWallpaper) {
                mSurfaceController.setPosition(t, xOffset, yOffset);
            } else {
                setWallpaperPositionAndScale(t, xOffset, yOffset, mWallpaperScale);
            }
        }

        final Task task = w.getTask();
        final Task task = w.getTask();
        if (shouldConsumeMainWindowSizeTransaction()) {
        if (shouldConsumeMainWindowSizeTransaction()) {
            if (isInBlastSync()) {
            if (isInBlastSync()) {
@@ -575,14 +553,8 @@ class WindowStateAnimator {
                    "SURFACE controller=%s alpha=%f HScale=%f, VScale=%f: %s",
                    "SURFACE controller=%s alpha=%f HScale=%f, VScale=%f: %s",
                    mSurfaceController, mShownAlpha, w.mHScale, w.mVScale, w);
                    mSurfaceController, mShownAlpha, w.mHScale, w.mVScale, w);


            boolean prepared = true;
            boolean prepared =

            if (mIsWallpaper) {
                setWallpaperPositionAndScale(t, mXOffset, mYOffset, mWallpaperScale);
            } else {
                prepared =
                mSurfaceController.prepareToShowInTransaction(t, mShownAlpha);
                mSurfaceController.prepareToShowInTransaction(t, mShownAlpha);
            }


            if (prepared && mDrawState == HAS_DRAWN) {
            if (prepared && mDrawState == HAS_DRAWN) {
                if (mLastHidden) {
                if (mLastHidden) {
@@ -635,53 +607,6 @@ class WindowStateAnimator {
        }
        }
    }
    }


    boolean setWallpaperOffset(int dx, int dy, float scale) {
        if (mXOffset == dx && mYOffset == dy && Float.compare(mWallpaperScale, scale) == 0) {
            return false;
        }
        mXOffset = dx;
        mYOffset = dy;
        mWallpaperScale = scale;

        if (mSurfaceController != null) {
            try {
                if (SHOW_LIGHT_TRANSACTIONS) {
                    Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset");
                }
                mService.openSurfaceTransaction();
                setWallpaperPositionAndScale(SurfaceControl.getGlobalTransaction(), dx, dy, scale);
            } catch (RuntimeException e) {
                Slog.w(TAG, "Error positioning surface of " + mWin
                        + " pos=(" + dx + "," + dy + ")", e);
            } finally {
                mService.closeSurfaceTransaction("setWallpaperOffset");
                if (SHOW_LIGHT_TRANSACTIONS) {
                    Slog.i(TAG, "<<< CLOSE TRANSACTION setWallpaperOffset");
                }
            }
        }

        return true;
    }

    private void setWallpaperPositionAndScale(SurfaceControl.Transaction t, int dx, int dy,
            float scale) {
        DisplayInfo displayInfo = mWin.getDisplayInfo();
        Matrix matrix = mWin.mTmpMatrix;
        matrix.setTranslate(dx, dy);
        matrix.postScale(scale, scale, displayInfo.logicalWidth / 2f,
                displayInfo.logicalHeight / 2f);
        matrix.getValues(mWin.mTmpMatrixArray);
        matrix.reset();

        mSurfaceController.setPosition(t,mWin.mTmpMatrixArray[MTRANS_X],
                mWin.mTmpMatrixArray[MTRANS_Y]);
        mSurfaceController.setMatrix(t, mWin.mTmpMatrixArray[MSCALE_X],
            mWin.mTmpMatrixArray[MSKEW_Y],
            mWin.mTmpMatrixArray[MSKEW_X],
            mWin.mTmpMatrixArray[MSCALE_Y]);
    }

    /**
    /**
     * Try to change the pixel format without recreating the surface. This
     * Try to change the pixel format without recreating the surface. This
     * will be common in the case of changing from PixelFormat.OPAQUE to
     * will be common in the case of changing from PixelFormat.OPAQUE to
+3 −3
Original line number Original line Diff line number Diff line
@@ -1386,11 +1386,11 @@ public class DisplayContentTests extends WindowTestsBase {
        performLayout(mDisplayContent);
        performLayout(mDisplayContent);


        // Force the negative offset to verify it can be updated.
        // Force the negative offset to verify it can be updated.
        mWallpaperWindow.mWinAnimator.mXOffset = mWallpaperWindow.mWinAnimator.mYOffset = -1;
        mWallpaperWindow.mXOffset = mWallpaperWindow.mYOffset = -1;
        assertTrue(mDisplayContent.mWallpaperController.updateWallpaperOffset(mWallpaperWindow,
        assertTrue(mDisplayContent.mWallpaperController.updateWallpaperOffset(mWallpaperWindow,
                false /* sync */));
                false /* sync */));
        assertThat(mWallpaperWindow.mWinAnimator.mXOffset).isGreaterThan(-1);
        assertThat(mWallpaperWindow.mXOffset).isGreaterThan(-1);
        assertThat(mWallpaperWindow.mWinAnimator.mYOffset).isGreaterThan(-1);
        assertThat(mWallpaperWindow.mYOffset).isGreaterThan(-1);


        // The wallpaper need to animate with transformed position, so its surface position should
        // The wallpaper need to animate with transformed position, so its surface position should
        // not be reset.
        // not be reset.
+1 −1
Original line number Original line Diff line number Diff line
@@ -212,7 +212,7 @@ public class WallpaperControllerTests extends WindowTestsBase {
        // value did, and we do dispatch the zoom to the wallpaper service
        // value did, and we do dispatch the zoom to the wallpaper service
        dc.mWallpaperController.setWallpaperZoomOut(homeWindow, newZoom);
        dc.mWallpaperController.setWallpaperZoomOut(homeWindow, newZoom);
        assertEquals(newZoom, wallpaperWindow.mWallpaperZoomOut, .01f);
        assertEquals(newZoom, wallpaperWindow.mWallpaperZoomOut, .01f);
        assertEquals(1f, wallpaperWindow.mWinAnimator.mWallpaperScale, .01f);
        assertEquals(1f, wallpaperWindow.mWallpaperScale, .01f);
        verify(wallpaperWindow.mClient).dispatchWallpaperOffsets(anyFloat(), anyFloat(), anyFloat(),
        verify(wallpaperWindow.mClient).dispatchWallpaperOffsets(anyFloat(), anyFloat(), anyFloat(),
                anyFloat(), eq(newZoom), anyBoolean());
                anyFloat(), eq(newZoom), anyBoolean());
    }
    }