From c11fac355d5057ad066adc3abbbb2b2d64fba5e7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 27 Feb 2018 19:20:15 -0800 Subject: [PATCH] Fixing widgets get deteled because of double bind If the AppWidgetHost starts listening in the middle of bind, it rebinds the old widgets before a new widget is bound, leading to double bind. We should clear all pending binds, before starting a rebind. As an extra check only rebind a view which is attached to the screen. Bug: 73814840 Change-Id: Ie3af683dc4095b158547e700d11e4faf7999466f --- src/com/android/launcher3/Launcher.java | 1 + src/com/android/launcher3/LauncherAppWidgetHost.java | 2 +- .../launcher3/widget/LauncherAppWidgetHostView.java | 7 ++++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 7209d9dca9..5ac53a88c1 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2239,6 +2239,7 @@ public class Launcher extends BaseActivity // Clear the workspace because it's going to be rebound mWorkspace.clearDropTargets(); mWorkspace.removeAllWorkspaceScreens(); + mAppWidgetHost.clearViews(); if (mHotseat != null) { mHotseat.resetLayout(); diff --git a/src/com/android/launcher3/LauncherAppWidgetHost.java b/src/com/android/launcher3/LauncherAppWidgetHost.java index 7bc713922b..56671a1582 100644 --- a/src/com/android/launcher3/LauncherAppWidgetHost.java +++ b/src/com/android/launcher3/LauncherAppWidgetHost.java @@ -236,7 +236,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost { } @Override - protected void clearViews() { + public void clearViews() { super.clearViews(); mViews.clear(); } diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java index 0b1474a037..9d74218e04 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java @@ -488,13 +488,14 @@ public class LauncherAppWidgetHostView extends AppWidgetHostView // Only reinflate when the final configuration is same as the required configuration if (mReinflateOnConfigChange && isSameOrientation()) { mReinflateOnConfigChange = false; - if (isAttachedToWindow()) { - reInflate(); - } + reInflate(); } } public void reInflate() { + if (!isAttachedToWindow()) { + return; + } LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) getTag(); // Remove and rebind the current widget (which was inflated in the wrong // orientation), but don't delete it from the database