diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index 23dd3bb01e..61b5564941 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,18 +210,23 @@ public abstract class ButtonDropTarget extends TextView return; } final DragLayer dragLayer = mLauncher.getDragLayer(); + final DragView dragView = d.dragView; final Rect from = new Rect(); dragLayer.getViewRectRelativeToSelf(d.dragView, from); final Rect to = getIconRect(d); final float scale = (float) to.width() / from.width(); - d.dragView.detachContentView(/* reattachToPreviousParent= */ true); + 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, from, to, scale, 1f, 1f, 0.1f, 0.1f, diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index f28f54a024..5bdc4022c2 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1786,8 +1786,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 @@ -1898,7 +1901,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); } @@ -1967,7 +1972,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 1664980c35..0acded5ade 100644 --- a/src/com/android/launcher3/dragndrop/DragView.java +++ b/src/com/android/launcher3/dragndrop/DragView.java @@ -66,6 +66,7 @@ import com.android.launcher3.statemanager.StateManager.StateListener; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.Thunk; 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 class DragView extends FrameLayout implements StateListener { @@ -490,6 +491,24 @@ public class DragView extends FrameLayout implements StateListener mDeferredColorChange = Optional.empty(); + private boolean mEnableColorExtraction = true; public LauncherAppWidgetHostView(Context context) { super(context); @@ -342,13 +343,7 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView } mIsScrollable = checkScrollableRecursively(this); - if (!mIsInDragMode && getTag() instanceof LauncherAppWidgetInfo) { - - LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); - mDragLayerRelativeCoordinateHelper.viewToRect(this, mCurrentWidgetSize); - updateColorExtraction(mCurrentWidgetSize, - mWorkspace.getPageIndexForScreenId(info.screenId)); - } + updateColorExtraction(); enforceRoundedCorners(); } @@ -377,6 +372,7 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView * @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()) { @@ -391,6 +387,38 @@ public class LauncherAppWidgetHostView extends NavigableAppWidgetHostView } } + /** + * 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) {