From 79d76b5041e0ac328e5c7d94f7ee326b630729f2 Mon Sep 17 00:00:00 2001 From: Steven Ng Date: Wed, 28 Apr 2021 23:16:22 +0100 Subject: [PATCH] Fix LayoutParams cast exception in drag-n-drop Test: Pick up a widget from home screen. Then drop it and immediately pick it up again before the resize frame is dismissed. No crash is observed. Bug: 186663184 Change-Id: Ia40676fbbf5d6dc2e2043aa7acd6ae00f1fa4179 --- .../launcher3/AppWidgetResizeFrame.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index 5d41bb5c3e..401b58b2d5 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -71,6 +71,22 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O private final View[] mDragHandles = new View[HANDLE_COUNT]; private final List mSystemGestureExclusionRects = new ArrayList<>(HANDLE_COUNT); + private final OnAttachStateChangeListener mWidgetViewAttachStateChangeListener = + new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + // Do nothing + } + + @Override + public void onViewDetachedFromWindow(View view) { + // When the app widget view is detached, we should close the resize frame. + // An example is when the dragging starts, the widget view is detached from + // CellLayout and then reattached to DragLayout. + close(false); + } + }; + private LauncherAppWidgetHostView mWidgetView; private CellLayout mCellLayout; @@ -191,7 +207,11 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O private void setupForWidget(LauncherAppWidgetHostView widgetView, CellLayout cellLayout, DragLayer dragLayer) { mCellLayout = cellLayout; + if (mWidgetView != null) { + mWidgetView.removeOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener); + } mWidgetView = widgetView; + mWidgetView.addOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener); LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo) widgetView.getAppWidgetInfo(); mResizeMode = info.resizeMode; @@ -641,6 +661,9 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O @Override protected void handleClose(boolean animate) { mDragLayer.removeView(this); + if (mWidgetView != null) { + mWidgetView.removeOnAttachStateChangeListener(mWidgetViewAttachStateChangeListener); + } } @Override