diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java index 55be4a4604..6bd62617fb 100644 --- a/src/com/android/launcher3/dragndrop/AddItemActivity.java +++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java @@ -189,10 +189,18 @@ public class AddItemActivity extends BaseActivity if (appWidgetHostView != null) { bounds = new Rect(); appWidgetHostView.getSourceVisualDragBounds(bounds); - bounds.offset(appWidgetHostView.getLeft() - (int) mLastTouchPos.x, - appWidgetHostView.getTop() - (int) mLastTouchPos.y); - listener = new PinItemDragListener(mRequest, bounds, - appWidgetHostView.getMeasuredWidth(), appWidgetHostView.getMeasuredWidth()); + float appWidgetHostViewScale = mWidgetCell.getAppWidgetHostViewScale(); + int xOffset = + appWidgetHostView.getLeft() - (int) (mLastTouchPos.x * appWidgetHostViewScale); + int yOffset = appWidgetHostView.getTop() + - (int) (mLastTouchPos.y * mWidgetCell.getAppWidgetHostViewScale()); + bounds.offset(xOffset, yOffset); + listener = new PinItemDragListener( + mRequest, + bounds, + appWidgetHostView.getMeasuredWidth(), + appWidgetHostView.getMeasuredWidth(), + appWidgetHostView.getScaleX()); } else { bounds = img.getBitmapBounds(); bounds.offset(img.getLeft() - (int) mLastTouchPos.x, diff --git a/src/com/android/launcher3/dragndrop/PinItemDragListener.java b/src/com/android/launcher3/dragndrop/PinItemDragListener.java index 2bdf8a085b..af43ae83e2 100644 --- a/src/com/android/launcher3/dragndrop/PinItemDragListener.java +++ b/src/com/android/launcher3/dragndrop/PinItemDragListener.java @@ -48,12 +48,19 @@ public class PinItemDragListener extends BaseItemDragListener { private final PinItemRequest mRequest; private final CancellationSignal mCancelSignal; + private final float mPreviewScale; public PinItemDragListener(PinItemRequest request, Rect previewRect, int previewBitmapWidth, int previewViewWidth) { + this(request, previewRect, previewBitmapWidth, previewViewWidth, /* previewScale= */ 1f); + } + + public PinItemDragListener(PinItemRequest request, Rect previewRect, + int previewBitmapWidth, int previewViewWidth, float previewScale) { super(previewRect, previewBitmapWidth, previewViewWidth); mRequest = request; mCancelSignal = new CancellationSignal(); + mPreviewScale = previewScale; } @Override @@ -98,7 +105,7 @@ public class PinItemDragListener extends BaseItemDragListener { PendingItemDragHelper dragHelper = new PendingItemDragHelper(view); if (mRequest.getRequestType() == PinItemRequest.REQUEST_TYPE_APPWIDGET) { - dragHelper.setRemoteViewsPreview(getPreview(mRequest)); + dragHelper.setRemoteViewsPreview(getPreview(mRequest), mPreviewScale); } return dragHelper; } diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java index adc7ba00e2..ee441747ac 100644 --- a/src/com/android/launcher3/widget/BaseWidgetSheet.java +++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java @@ -176,7 +176,9 @@ public abstract class BaseWidgetSheet extends AbstractSlideInView } PendingItemDragHelper dragHelper = new PendingItemDragHelper(v); - dragHelper.setRemoteViewsPreview(v.getRemoteViewsPreview()); + // RemoteViews are being rendered in AppWidgetHostView in WidgetCell. And thus, the scale of + // RemoteViews is equivalent to the AppWidgetHostView scale. + dragHelper.setRemoteViewsPreview(v.getRemoteViewsPreview(), v.getAppWidgetHostViewScale()); dragHelper.setAppWidgetHostViewPreview(v.getAppWidgetHostViewPreview()); if (image.getDrawable() != null) { diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java index cea4de7b37..a4003d4f89 100644 --- a/src/com/android/launcher3/widget/PendingItemDragHelper.java +++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java @@ -22,6 +22,7 @@ import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.util.Size; import android.view.View; import android.view.View.MeasureSpec; import android.widget.RemoteViews; @@ -41,6 +42,7 @@ import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.icons.RoundDrawableWrapper; import com.android.launcher3.widget.dragndrop.AppWidgetHostViewDragListener; +import com.android.launcher3.widget.util.WidgetSizes; /** * Extension of {@link DragPreviewProvider} with logic specific to pending widgets/shortcuts @@ -54,6 +56,7 @@ public class PendingItemDragHelper extends DragPreviewProvider { private int[] mEstimatedCellSize; @Nullable private RemoteViews mRemoteViewsPreview; + private float mRemoteViewsPreviewScale = 1f; @Nullable private NavigableAppWidgetHostView mAppWidgetHostViewPreview; private final float mEnforcedRoundedCornersForWidget; @@ -68,8 +71,10 @@ public class PendingItemDragHelper extends DragPreviewProvider { * Sets a {@link RemoteViews} which shows an app widget preview provided by app developers in * the pin widget flow. */ - public void setRemoteViewsPreview(@Nullable RemoteViews remoteViewsPreview) { + public void setRemoteViewsPreview(@Nullable RemoteViews remoteViewsPreview, + float previewScale) { mRemoteViewsPreview = remoteViewsPreview; + mRemoteViewsPreviewScale = previewScale; } /** Sets a {@link NavigableAppWidgetHostView} which shows a preview layout of an app widget. */ @@ -120,13 +125,14 @@ public class PendingItemDragHelper extends DragPreviewProvider { mAppWidgetHostViewPreview.setPadding(padding.left, padding.top, padding.right, padding.bottom); mAppWidgetHostViewPreview.updateAppWidget(/* remoteViews= */ mRemoteViewsPreview); - int width = - deviceProfile.cellWidthPx * mAddInfo.spanX + padding.left + padding.right; - int height = - deviceProfile.cellHeightPx * mAddInfo.spanY + padding.top + padding.bottom; + Size widgetSizes = WidgetSizes.getWidgetPaddedSizePx(launcher, + mAddInfo.componentName, deviceProfile, mAddInfo.spanX, mAddInfo.spanY); mAppWidgetHostViewPreview.measure( - MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + MeasureSpec.makeMeasureSpec(widgetSizes.getWidth(), MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(widgetSizes.getHeight(), MeasureSpec.EXACTLY)); + mAppWidgetHostViewPreview.setClipChildren(false); + mAppWidgetHostViewPreview.setClipToPadding(false); + mAppWidgetHostViewPreview.setScaleToFit(mRemoteViewsPreviewScale); } if (mAppWidgetHostViewPreview != null) { previewSizeBeforeScale[0] = mAppWidgetHostViewPreview.getMeasuredWidth(); diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index edcab4e5c6..be8fddfdfb 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -127,6 +127,7 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { private RemoteViews mRemoteViewsPreview; private NavigableAppWidgetHostView mAppWidgetHostViewPreview; + private float mAppWidgetHostViewScale = 1f; private int mSourceContainer = CONTAINER_WIDGETS_TRAY; public WidgetCell(Context context) { @@ -177,6 +178,11 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { return mRemoteViewsPreview; } + /** Returns the app widget host view scale, which is a value between [0f, 1f]. */ + public float getAppWidgetHostViewScale() { + return mAppWidgetHostViewScale; + } + /** * Called to clear the view and free attached resources. (e.g., {@link Bitmap} */ @@ -202,6 +208,7 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { mWidgetImageContainer.removeView(mAppWidgetHostViewPreview); } mAppWidgetHostViewPreview = null; + mAppWidgetHostViewScale = 1f; mItem = null; } @@ -364,8 +371,8 @@ public class WidgetCell extends LinearLayout implements OnLayoutChangeListener { if (shouldScale) { setNoClip(mWidgetImageContainer); setNoClip(mAppWidgetHostViewPreview); - float previewLayoutScale = computeWidgetPreviewScale(); - mAppWidgetHostViewPreview.setScaleToFit(previewLayoutScale); + mAppWidgetHostViewScale = computeWidgetPreviewScale(); + mAppWidgetHostViewPreview.setScaleToFit(mAppWidgetHostViewScale); } } FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(