From 206066b6cc83f45a5b2c1dfa10f89ab68f43a6bc Mon Sep 17 00:00:00 2001 From: Pierre Barbier de Reuille Date: Thu, 28 Oct 2021 14:51:39 +0000 Subject: [PATCH] Check if a view can be recycled in async case. When implementing the code, it seems this was forgotten :( If the view id of the root of the RemoteViews is changed, currently, the top-level view will be re-used, which is an error. Bug: 181985606 Test: atest android.widget.cts.RemoteViewsRecyclingTest Change-Id: I5a8addb08f597ec574e3ed49d1318771e4c7c767 --- core/java/android/appwidget/AppWidgetHostView.java | 2 +- core/java/android/widget/RemoteViews.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index eb10f097f37f1..7c2b1b72fbf1f 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -626,7 +626,7 @@ public class AppWidgetHostView extends FrameLayout { // If our stale view has been prepared to match active, and the new // layout matches, try recycling it - if (layoutId == mLayoutId && mView != null) { + if (remoteViews.canRecycleView(mView)) { try { mLastExecutionSignal = remoteViews.reapplyAsync(mContext, mView, diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 0f309f10c2b79..2357d13c8d41d 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5795,7 +5795,7 @@ public class RemoteViews implements Parcelable, Filter { // across orientation change, and has the RemoteViews re-applied in the new orientation, // we throw an exception, since the layouts may be completely unrelated. if (hasMultipleLayouts()) { - if ((Integer) v.getTag(R.id.widget_frame) != rvToApply.getLayoutId()) { + if (!rvToApply.canRecycleView(v)) { throw new RuntimeException("Attempting to re-apply RemoteViews to a view that" + " that does not share the same root layout id."); }