diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index 0a674b5fb1..0d33b6f993 100644 --- a/src/com/android/launcher3/ButtonDropTarget.java +++ b/src/com/android/launcher3/ButtonDropTarget.java @@ -20,15 +20,12 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static com.android.launcher3.LauncherState.NORMAL; -import android.animation.AnimatorSet; import android.content.Context; -import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.AttributeSet; -import android.util.Property; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -40,6 +37,7 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; +import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.model.data.ItemInfo; /** @@ -212,15 +210,20 @@ public abstract class ButtonDropTarget extends TextView return; } final DragLayer dragLayer = mLauncher.getDragLayer(); + final DragView dragView = d.dragView; final Rect to = getIconRect(d); - final float scale = (float) to.width() / d.dragView.getMeasuredWidth(); - d.dragView.detachContentView(/* reattachToPreviousParent= */ true); + final float scale = (float) to.width() / dragView.getMeasuredWidth(); + dragView.disableColorExtraction(); + dragView.detachContentView(/* reattachToPreviousParent= */ true); mDropTargetBar.deferOnDragEnd(); Runnable onAnimationEndRunnable = () -> { completeDrop(d); mDropTargetBar.onDragEnd(); mLauncher.getStateManager().goToState(NORMAL); + // Only re-enable updates once the workspace is back to normal, which will be after the + // current frame. + post(dragView::resumeColorExtraction); }; dragLayer.animateView(d.dragView, to, scale, 0.1f, 0.1f, diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f412f92a79..56893949bf 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1833,8 +1833,11 @@ public class Workspace extends PagedView onDropExternal(touchXY, dropTargetLayout, d); } else { final View cell = mDragInfo.cell; + final DragView dragView = d.dragView; boolean droppedOnOriginalCellDuringTransition = false; - Runnable onCompleteRunnable = null; + Runnable onCompleteRunnable = dragView::resumeColorExtraction; + + dragView.disableColorExtraction(); if (dropTargetLayout != null && !d.cancelled) { // Move internally @@ -1945,7 +1948,9 @@ public class Workspace extends PagedView AppWidgetProviderInfo pInfo = hostView.getAppWidgetInfo(); if (pInfo != null && pInfo.resizeMode != AppWidgetProviderInfo.RESIZE_NONE && !options.isAccessibleDrag) { + final Runnable previousRunnable = onCompleteRunnable; onCompleteRunnable = () -> { + previousRunnable.run(); if (!isPageInTransition()) { AppWidgetResizeFrame.showForWidget(hostView, cellLayout); } @@ -2014,7 +2019,7 @@ public class Workspace extends PagedView parent.onDropChild(cell); mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY, - onCompleteRunnable == null ? null : forSuccessCallback(onCompleteRunnable)); + forSuccessCallback(onCompleteRunnable)); mStatsLogManager.logger().withItemInfo(d.dragInfo).withInstanceId(d.logInstanceId) .log(LauncherEvent.LAUNCHER_ITEM_DROP_COMPLETED); } diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java index fb1a6bef18..3f941e1785 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -63,6 +63,7 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.util.RunnableList; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.BaseDragLayer; +import com.android.launcher3.widget.LauncherAppWidgetHostView; /** A custom view for rendering an icon, folder, shortcut or widget during drag-n-drop. */ public abstract class DragView extends FrameLayout { @@ -466,6 +467,24 @@ public abstract class DragView extends Fram } } + /** + * If the drag view uses color extraction, block it. + */ + public void disableColorExtraction() { + if (mContent instanceof LauncherAppWidgetHostView) { + ((LauncherAppWidgetHostView) mContent).disableColorExtraction(); + } + } + + /** + * If the drag view uses color extraction, restores it. + */ + public void resumeColorExtraction() { + if (mContent instanceof LauncherAppWidgetHostView) { + ((LauncherAppWidgetHostView) mContent).enableColorExtraction(/* updateColors= */ false); + } + } + /** * Removes this view from the {@link DragLayer}. * diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java index 06c9610f21..bfe1587dbf 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java @@ -100,6 +100,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView private long mDeferUpdatesUntilMillis = 0; private RemoteViews mDeferredRemoteViews; private Optional mDeferredColorChange = Optional.empty(); + private boolean mEnableColorExtraction = true; public LauncherAppWidgetHostView(Context context) { super(context); @@ -301,12 +302,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView super.onLayout(changed, left, top, right, bottom); mIsScrollable = checkScrollableRecursively(this); - if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo) { - LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); - mDragLayerRelativeCoordinateHelper.viewToRect(this, mCurrentWidgetSize); - updateColorExtraction(mCurrentWidgetSize, - mWorkspace.getPageIndexForScreenId(info.screenId)); - } + updateColorExtraction(); } /** Starts the drag mode. */ @@ -333,6 +329,7 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView * @param pageId The workspace page the widget is on. */ private void updateColorExtraction(Rect rectInDragLayer, int pageId) { + if (!mEnableColorExtraction) return; mColorExtractor.getExtractedRectForViewRect(mLauncher, pageId, rectInDragLayer, mTempRectF); if (mTempRectF.isEmpty()) { @@ -347,6 +344,38 @@ public class LauncherAppWidgetHostView extends BaseLauncherAppWidgetHostView } } + /** + * Update the color extraction, using the current position of the app widget. + */ + private void updateColorExtraction() { + if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo) { + LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); + mDragLayerRelativeCoordinateHelper.viewToRect(this, mCurrentWidgetSize); + updateColorExtraction(mCurrentWidgetSize, + mWorkspace.getPageIndexForScreenId(info.screenId)); + } + } + + /** + * Enables the local color extraction. + * + * @param updateColors If true, this will update the color extraction using the current location + * of the App Widget. + */ + public void enableColorExtraction(boolean updateColors) { + mEnableColorExtraction = true; + if (updateColors) { + updateColorExtraction(); + } + } + + /** + * Disables the local color extraction. + */ + public void disableColorExtraction() { + mEnableColorExtraction = false; + } + // Compare two location rectangles. Locations are always in the [0;1] range. private static boolean isSameLocation(@NonNull RectF rect1, @Nullable RectF rect2, float epsilon) {