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

Commit f7ff3fe5 authored by Jon Miranda's avatar Jon Miranda
Browse files

Scale widgets when dragging and dropping in multi-window mode.

This change mimics the non-MW mode behavior when dragging and
dropping widgets by taking the app widget scale into consideration.
This ensures a consistant drag and drop experience between
MW mode and non-MW mode.

* Uses cell data (cell height/width, spanX/Y) to get the expected
widget sizes.
* Scales sizes when necessary.

Bug: 32176631
Change-Id: Icdaf73ecd89a30e57fe7f405292d793f2d6a3ee8
parent 4633be64
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1041,7 +1041,7 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler {
                    // Offsets due to the size difference between the View and the dragOutline.
                    // There is a size difference to account for the outer blur, which may lie
                    // outside the bounds of the view.
                    top += (v.getHeight() - dragOutline.getHeight()) / 2;
                    top += ((mCellHeight * spanY) - dragOutline.getHeight()) / 2;
                    // We center about the x axis
                    left += ((mCellWidth * spanX) - dragOutline.getWidth()) / 2;
                } else {
+7 −7
Original line number Diff line number Diff line
@@ -3467,14 +3467,14 @@ public class Workspace extends PagedView
                mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(layout, loc, true);
        resetTransitionTransform(layout);

        float dragViewScaleX;
        float dragViewScaleY;
        float dragViewScaleX = 1f;
        float dragViewScaleY = 1f;
        if (scale) {
            dragViewScaleX = (1.0f * r.width()) / dragView.getMeasuredWidth();
            dragViewScaleY = (1.0f * r.height()) / dragView.getMeasuredHeight();
        } else {
            dragViewScaleX = 1f;
            dragViewScaleY = 1f;
            float width = info.spanX * layout.mCellWidth;
            float height = info.spanY * layout.mCellHeight;

            dragViewScaleX = r.width() / width;
            dragViewScaleY = r.height() / height;
        }

        // The animation will scale the dragView about its center, so we need to center about
+49 −10
Original line number Diff line number Diff line
@@ -24,7 +24,9 @@ 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;
import com.android.launcher3.Workspace;
import com.android.launcher3.config.ProviderConfig;
@@ -100,20 +102,31 @@ public class DragPreviewProvider {
     * Responsibility for the bitmap is transferred to the caller.
     */
    public Bitmap createDragBitmap(Canvas canvas) {
        Bitmap b;
        float scale = 1f;
        int width = mView.getWidth();
        int height = mView.getHeight();

        if (mView instanceof TextView) {
            Drawable d = Workspace.getTextViewIcon((TextView) mView);
            Rect bounds = getDrawableBounds(d);
            b = Bitmap.createBitmap(bounds.width() + DRAG_BITMAP_PADDING,
                    bounds.height() + DRAG_BITMAP_PADDING, Bitmap.Config.ARGB_8888);
        } else {
            b = Bitmap.createBitmap(mView.getWidth() + DRAG_BITMAP_PADDING,
                    mView.getHeight() + DRAG_BITMAP_PADDING, Bitmap.Config.ARGB_8888);
            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);
            width = (int) (mView.getWidth() * scale);
            height = (int) (mView.getHeight() * scale);
        }

        Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING,
                Bitmap.Config.ARGB_8888);
        canvas.setBitmap(b);

        canvas.save();
        canvas.scale(scale, scale);
        drawDragView(canvas);
        canvas.restore();

        canvas.setBitmap(null);

        return b;
@@ -132,12 +145,29 @@ public class DragPreviewProvider {
     * Responsibility for the bitmap is transferred to the caller.
     */
    public Bitmap createDragOutline(Canvas canvas) {
        final Bitmap b = Bitmap.createBitmap(mView.getWidth() + DRAG_BITMAP_PADDING,
                mView.getHeight() + DRAG_BITMAP_PADDING, Bitmap.Config.ALPHA_8);
        float scale = 1f;
        int width = mView.getWidth();
        int height = mView.getHeight();

        if (mView instanceof LauncherAppWidgetHostView) {
            DeviceProfile profile = Launcher.getLauncher(mView.getContext()).getDeviceProfile();
            scale = Math.min(profile.appWidgetScale.x, profile.appWidgetScale.y);
            width = (int) Math.floor(mView.getWidth() * scale);
            height = (int) Math.floor(mView.getHeight() * scale);
        }

        Bitmap b = Bitmap.createBitmap(width + DRAG_BITMAP_PADDING, height + DRAG_BITMAP_PADDING,
                Bitmap.Config.ALPHA_8);
        canvas.setBitmap(b);

        canvas.save();
        canvas.scale(scale, scale);
        drawDragView(canvas);
        canvas.restore();

        HolographicOutlineHelper.getInstance(mView.getContext())
                .applyExpensiveOutlineWithBlur(b, canvas);

        canvas.setBitmap(null);
        return b;
    }
@@ -160,8 +190,17 @@ public class DragPreviewProvider {
    public float getScaleAndPosition(Bitmap preview, int[] outPos) {
        float scale = Launcher.getLauncher(mView.getContext())
                .getDragLayer().getLocationInDragLayer(mView, outPos);
        outPos[0] = Math.round(outPos[0] - (preview.getWidth() - scale * mView.getWidth()) / 2);
        outPos[1] = Math.round(outPos[1] - (1 - scale) * preview.getHeight() / 2 - previewPadding / 2);
        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);
        }

        outPos[0] = Math.round(outPos[0] -
                (preview.getWidth() - scale * mView.getWidth() * mView.getScaleX()) / 2);
        outPos[1] = Math.round(outPos[1] - (1 - scale) * preview.getHeight() / 2
                - previewPadding / 2);
        return scale;
    }
}