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

Commit 80aa8da7 authored by Jon Miranda's avatar Jon Miranda Committed by Android (Google) Code Review
Browse files

Merge "Scale, crop, and translate window when swiping back to home." into sc-v2-dev

parents 2ecf688d 32ec4d52
Loading
Loading
Loading
Loading
+43 −11
Original line number Diff line number Diff line
@@ -660,10 +660,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
        AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(), mDeviceProfile,
                windowTargetBounds, launcherIconBounds, v, dragLayerBounds[0], dragLayerBounds[1],
                hasSplashScreen, floatingView.isDifferentFromAppIcon());
        int left = (int) (prop.cropCenterXStart - prop.cropWidthStart / 2);
        int top = (int) (prop.cropCenterYStart - prop.cropHeightStart / 2);
        int right = (int) (left + prop.cropWidthStart);
        int bottom = (int) (top + prop.cropHeightStart);
        int left = prop.cropCenterXStart - prop.cropWidthStart / 2;
        int top = prop.cropCenterYStart - prop.cropHeightStart / 2;
        int right = left + prop.cropWidthStart;
        int bottom = top + prop.cropHeightStart;
        // Set the crop here so we can calculate the corner radius below.
        crop.set(left, top, right, bottom);

@@ -1329,6 +1329,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
                mDeviceProfile);

        // Hook up floating views to the closing window animators.
        final int rotationChange = getRotationChange(targets);
        Rect windowTargetBounds = getWindowTargetBounds(targets, rotationChange);
        if (floatingIconView != null) {
            anim.addAnimatorListener(floatingIconView);
            floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged);
@@ -1339,7 +1341,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
            // FolderIconView can be seen morphing into the icon shape.
            final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION;

            RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect) {
            RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
                    windowTargetBounds) {
                @Override
                public void onUpdate(RectF currentRectF, float progress) {
                    finalFloatingIconView.update(1f, 255 /* fgAlpha */, currentRectF, progress,
@@ -1356,7 +1359,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener

            final float floatingWidgetAlpha = isTransluscent ? 0 : 1;
            FloatingWidgetView finalFloatingWidget = floatingWidget;
            RectFSpringAnim.OnUpdateListener  runner = new SpringAnimRunner(targets, targetRect) {
            RectFSpringAnim.OnUpdateListener  runner = new SpringAnimRunner(targets, targetRect,
                    windowTargetBounds) {
                @Override
                public void onUpdate(RectF currentRectF, float progress) {
                    final float fallbackBackgroundAlpha =
@@ -1767,12 +1771,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
        private final float mStartRadius;
        private final float mEndRadius;
        private final SurfaceTransactionApplier mSurfaceApplier;
        private final Rect mWindowTargetBounds = new Rect();

        SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect) {
        private final Rect mTmpRect = new Rect();

        SpringAnimRunner(RemoteAnimationTargetCompat[] appTargets, RectF targetRect,
                Rect windowTargetBounds) {
            mAppTargets = appTargets;
            mStartRadius = QuickStepContract.getWindowCornerRadius(mLauncher);
            mEndRadius = Math.max(1, targetRect.width()) / 2f;
            mSurfaceApplier = new SurfaceTransactionApplier(mDragLayer);
            mWindowTargetBounds.set(windowTargetBounds);
        }

        public float getCornerRadius(float progress) {
@@ -1793,13 +1802,36 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
                }

                if (target.mode == MODE_CLOSING) {
                    float alpha = getWindowAlpha(progress);
                    currentRectF.round(mCurrentRect);

                    // Scale the target window to match the currentRectF.
                    final float scale;

                    // We need to infer the crop (we crop the window to match the currentRectF).
                    if (mWindowTargetBounds.height() > mWindowTargetBounds.width()) {
                        scale = Math.min(1f, currentRectF.width() / mWindowTargetBounds.width());

                        int unscaledHeight = (int) (mCurrentRect.height() * (1f / scale));
                        int croppedHeight = mWindowTargetBounds.height() - unscaledHeight;
                        mTmpRect.set(0, 0, mWindowTargetBounds.width(),
                                mWindowTargetBounds.height() - croppedHeight);
                    } else {
                        scale = Math.min(1f, currentRectF.height() / mWindowTargetBounds.height());

                        int unscaledWidth = (int) (mCurrentRect.width() * (1f / scale));
                        int croppedWidth = mWindowTargetBounds.width() - unscaledWidth;
                        mTmpRect.set(0, 0, mWindowTargetBounds.width() - croppedWidth,
                                mWindowTargetBounds.height());
                    }

                    // Match size and position of currentRect.
                    mMatrix.setScale(scale, scale);
                    mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);

                    builder.withMatrix(mMatrix)
                            .withWindowCrop(mCurrentRect)
                            .withAlpha(alpha)
                            .withCornerRadius(getCornerRadius(progress));
                            .withWindowCrop(mTmpRect)
                            .withAlpha(getWindowAlpha(progress))
                            .withCornerRadius(getCornerRadius(progress) / scale);
                } else if (target.mode == MODE_OPENING) {
                    mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
                    builder.withMatrix(mMatrix)