summaryrefslogtreecommitdiff
path: root/core/java/android/appwidget/AppWidgetHostView.java
diff options
context:
space:
mode:
authorPierre Barbier de Reuille <pbdr@google.com>2021-11-09 13:59:32 +0000
committerPierre Barbier de Reuille <pbdr@google.com>2021-11-09 14:55:39 +0000
commit3abdfaaa8ae9cce14cbdb83f2446a667154019cb (patch)
treefc38e7ed2af0dbb19fdf06e24dbe1da957900298 /core/java/android/appwidget/AppWidgetHostView.java
parent61569f50fb9f5076c031a74b1d3c9c732c76e521 (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.java16
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();
}