diff options
| author | Pierre Barbier de Reuille <pbdr@google.com> | 2021-11-09 13:59:32 +0000 |
|---|---|---|
| committer | Pierre Barbier de Reuille <pbdr@google.com> | 2021-11-09 14:55:39 +0000 |
| commit | 3abdfaaa8ae9cce14cbdb83f2446a667154019cb (patch) | |
| tree | fc38e7ed2af0dbb19fdf06e24dbe1da957900298 /core/java/android/appwidget/AppWidgetHostView.java | |
| parent | 61569f50fb9f5076c031a74b1d3c9c732c76e521 (diff) | |
Prevent recycling if the color mapping changed.
It was done in a weird way by "forgetting" the layoutId. It's now done
explicitly, which should make it more robust in the future.
Fix: 205265677
Test: Manually
Change-Id: Ie8b88a2b17e8f680f14fa19a485cd91853d90142
Diffstat (limited to 'core/java/android/appwidget/AppWidgetHostView.java')
| -rw-r--r-- | core/java/android/appwidget/AppWidgetHostView.java | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 7c2b1b72fbf1..8be2b4873c67 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -97,7 +97,8 @@ public class AppWidgetHostView extends FrameLayout { AppWidgetProviderInfo mInfo; View mView; int mViewMode = VIEW_MODE_NOINIT; - int mLayoutId = -1; + // If true, we should not try to re-apply the RemoteViews on the next inflation. + boolean mColorMappingChanged = false; private InteractionHandler mInteractionHandler; private boolean mOnLightBackground; private SizeF mCurrentSize = null; @@ -540,7 +541,6 @@ public class AppWidgetHostView extends FrameLayout { return; } content = getDefaultView(); - mLayoutId = -1; mViewMode = VIEW_MODE_DEFAULT; } else { // Select the remote view we are actually going to apply. @@ -557,8 +557,7 @@ public class AppWidgetHostView extends FrameLayout { // inflate any requested LayoutParams. mRemoteContext = getRemoteContextEnsuringCorrectCachedApkPath(); - int layoutId = rvToApply.getLayoutId(); - if (rvToApply.canRecycleView(mView)) { + if (!mColorMappingChanged && rvToApply.canRecycleView(mView)) { try { rvToApply.reapply(mContext, mView, mInteractionHandler, mCurrentSize, mColorResources); @@ -583,7 +582,6 @@ public class AppWidgetHostView extends FrameLayout { } } - mLayoutId = layoutId; mViewMode = VIEW_MODE_CONTENT; } @@ -591,6 +589,7 @@ public class AppWidgetHostView extends FrameLayout { } private void applyContent(View content, boolean recycled, Exception exception) { + mColorMappingChanged = false; if (content == null) { if (mViewMode == VIEW_MODE_ERROR) { // We've already done this -- nothing to do. @@ -626,7 +625,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 (remoteViews.canRecycleView(mView)) { + if (!mColorMappingChanged && remoteViews.canRecycleView(mView)) { try { mLastExecutionSignal = remoteViews.reapplyAsync(mContext, mView, @@ -666,7 +665,6 @@ public class AppWidgetHostView extends FrameLayout { @Override public void onViewApplied(View v) { - AppWidgetHostView.this.mLayoutId = mLayoutId; mViewMode = VIEW_MODE_CONTENT; applyContent(v, mIsReapply, null); @@ -907,7 +905,7 @@ public class AppWidgetHostView extends FrameLayout { } mColorMapping = colorMapping.clone(); mColorResources = RemoteViews.ColorResources.create(mContext, mColorMapping); - mLayoutId = -1; + mColorMappingChanged = true; mViewMode = VIEW_MODE_NOINIT; reapplyLastRemoteViews(); } @@ -937,7 +935,7 @@ public class AppWidgetHostView extends FrameLayout { if (mColorResources != null) { mColorResources = null; mColorMapping = null; - mLayoutId = -1; + mColorMappingChanged = true; mViewMode = VIEW_MODE_NOINIT; reapplyLastRemoteViews(); } |
