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

Commit bf8a265d authored by Jonathan Miranda's avatar Jonathan Miranda Committed by Android (Google) Code Review
Browse files

Merge "Fix widget reorder animations in multi-window mode." into ub-launcher3-master

parents 83d40e06 2126691c
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -354,8 +354,7 @@ public class AppWidgetResizeFrame extends FrameLayout
    }

    public void snapToWidget(boolean animate) {
        DeviceProfile profile = mLauncher.getDeviceProfile();
        float scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y);
        float scale = mWidgetView.getScaleToFit();

        mDragLayer.getViewRectRelativeToSelf(mWidgetView, sTmpRect);

+41 −21
Original line number Diff line number Diff line
@@ -1972,6 +1972,8 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
        private static final int PREVIEW_DURATION = 300;
        private static final int HINT_DURATION = Workspace.REORDER_TIMEOUT;

        private static final float CHILD_DIVIDEND = 4.0f;

        public static final int MODE_HINT = 0;
        public static final int MODE_PREVIEW = 1;

@@ -1987,42 +1989,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
            final int y1 = mTmpPoint[1];
            final int dX = x1 - x0;
            final int dY = y1 - y0;
            finalDeltaX = 0;
            finalDeltaY = 0;

            this.child = child;
            this.mode = mode;
            setInitialAnimationValues(false);
            finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale;
            finalDeltaX = initDeltaX;
            finalDeltaY = initDeltaY;
            int dir = mode == MODE_HINT ? -1 : 1;
            if (dX == dY && dX == 0) {
            } else {
                if (dY == 0) {
                    finalDeltaX = - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
                    finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
                } else if (dX == 0) {
                    finalDeltaY = - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
                    finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
                } else {
                    double angle = Math.atan( (float) (dY) / dX);
                    finalDeltaX = (int) (- dir * Math.signum(dX) *
                    finalDeltaX += (int) (- dir * Math.signum(dX) *
                            Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude));
                    finalDeltaY = (int) (- dir * Math.signum(dY) *
                    finalDeltaY += (int) (- dir * Math.signum(dY) *
                            Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude));
                }
            }
            this.mode = mode;
        }

        void setInitialAnimationValues(boolean restoreOriginalValues) {
            if (restoreOriginalValues) {
                if (child instanceof LauncherAppWidgetHostView) {
                    LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child;
                    initScale = lahv.getScaleToFit();
                    initDeltaX = lahv.getTranslationForCentering().x;
                    initDeltaY = lahv.getTranslationForCentering().y;
                } else {
                    initScale = mChildScale;
                    initDeltaX = 0;
                    initDeltaY = 0;
                }
            } else {
                initScale = child.getScaleX();
                initDeltaX = child.getTranslationX();
                initDeltaY = child.getTranslationY();
            finalScale = mChildScale - 4.0f / child.getWidth();
            initScale = child.getScaleX();
            this.child = child;
            }
        }

        void animate() {
            boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY);

            if (mShakeAnimators.containsKey(child)) {
                ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child);
                oldAnimation.cancel();
                mShakeAnimators.remove(child);
                if (finalDeltaX == 0 && finalDeltaY == 0) {
                if (noMovement) {
                    completeAnimationImmediately();
                    return;
                }
            }
            if (finalDeltaX == 0 && finalDeltaY == 0) {
            if (noMovement) {
                return;
            }
            ValueAnimator va = LauncherAnimUtils.ofFloat(child, 0f, 1f);
@@ -2055,9 +2077,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
            va.addListener(new AnimatorListenerAdapter() {
                public void onAnimationRepeat(Animator animation) {
                    // We make sure to end only after a full period
                    initDeltaX = 0;
                    initDeltaY = 0;
                    initScale = mChildScale;
                    setInitialAnimationValues(true);
                    repeating = true;
                }
            });
@@ -2077,10 +2097,10 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
            }

            a = new LauncherViewPropertyAnimator(child)
                .scaleX(mChildScale)
                .scaleY(mChildScale)
                .translationX(0)
                .translationY(0)
                .scaleX(initScale)
                .scaleY(initScale)
                .translationX(initDeltaX)
                .translationY(initDeltaY)
                .setDuration(REORDER_ANIMATION_DURATION);
            a.setInterpolator(new android.view.animation.DecelerateInterpolator(1.5f));
            a.start();
+31 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.launcher3;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Handler;
import android.os.SystemClock;
@@ -72,6 +73,16 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
    private boolean mIsAutoAdvanceRegistered;
    private Runnable mAutoAdvanceRunnable;

    /**
     * The scaleX and scaleY value such that the widget fits within its cellspans, scaleX = scaleY.
     */
    private float mScaleToFit = 1f;

    /**
     * The translation values to center the widget within its cellspans.
     */
    private final PointF mTranslationForCentering = new PointF(0, 0);

    public LauncherAppWidgetHostView(Context context) {
        super(context);
        mContext = context;
@@ -415,4 +426,24 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView implements Touc
        }
        scheduleNextAdvance();
    }

    public void setScaleToFit(float scale) {
        mScaleToFit = scale;
        setScaleX(scale);
        setScaleY(scale);
    }

    public float getScaleToFit() {
        return mScaleToFit;
    }

    public void setTranslationForCentering(float x, float y) {
        mTranslationForCentering.set(x, y);
        setTranslationX(x);
        setTranslationY(y);
    }

    public PointF getTranslationForCentering() {
        return mTranslationForCentering;
    }
}
+5 −7
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.launcher3;

import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
@@ -148,17 +147,16 @@ public class ShortcutAndWidgetContainer extends ViewGroup {
                CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();

                if (child instanceof LauncherAppWidgetHostView) {
                    LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child;

                    // Scale and center the widget to fit within its cells.
                    DeviceProfile profile = mLauncher.getDeviceProfile();
                    float scaleX = profile.appWidgetScale.x;
                    float scaleY = profile.appWidgetScale.y;

                    float scale = Math.min(scaleX, scaleY);
                    child.setScaleX(scale);
                    child.setScaleY(scale);

                    child.setTranslationX(-(lp.width - (lp.width * scaleX)) / 2.0f);
                    child.setTranslationY(-(lp.height - (lp.height * scaleY)) / 2.0f);
                    lahv.setScaleToFit(Math.min(scaleX, scaleY));
                    lahv.setTranslationForCentering(-(lp.width - (lp.width * scaleX)) / 2.0f,
                            -(lp.height - (lp.height * scaleY)) / 2.0f);
                }

                int childLeft = lp.x;
+3 −7
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.TextView;

import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppWidgetHostView;
import com.android.launcher3.PreloadIconDrawable;
@@ -120,8 +119,7 @@ public class DragPreviewProvider {
            width = bounds.width();
            height = bounds.height();
        } else if (mView instanceof LauncherAppWidgetHostView) {
            DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile();
            scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y);
            scale = ((LauncherAppWidgetHostView) mView).getScaleToFit();
            width = (int) (mView.getWidth() * scale);
            height = (int) (mView.getHeight() * scale);
        }
@@ -158,8 +156,7 @@ public class DragPreviewProvider {
        int height = mView.getHeight();

        if (mView instanceof LauncherAppWidgetHostView) {
            DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile();
            scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y);
            scale = ((LauncherAppWidgetHostView) mView).getScaleToFit();
            width = (int) Math.floor(mView.getWidth() * scale);
            height = (int) Math.floor(mView.getHeight() * scale);
        }
@@ -198,11 +195,10 @@ public class DragPreviewProvider {
    public float getScaleAndPosition(Bitmap preview, int[] outPos) {
        float scale = Launcher.getLauncher(mView.getContext())
                .getDragLayer().getLocationInDragLayer(mView, outPos);
        DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile();
        if (mView instanceof LauncherAppWidgetHostView) {
            // App widgets are technically scaled, but are drawn at their expected size -- so the
            // app widget scale should not affect the scale of the preview.
            scale /= Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y);
            scale /= ((LauncherAppWidgetHostView) mView).getScaleToFit();
        }

        outPos[0] = Math.round(outPos[0] -