From 3f45bdada2658b75b26ba273af67fac9f04c2c11 Mon Sep 17 00:00:00 2001 From: Sihua Ma <sihua@google.com> Date: Thu, 18 Jan 2024 06:22:56 +0000 Subject: [PATCH] Revert "Making adapter child views in RemoteCollectionItemsAdapter size-aware" This reverts commit 28dcae492cc91182e3242a4fb6ef5b65a67637db. Reason for revert: Revert framework changes on test platform, will follow up with a CL that makes the CTS test permissive Change-Id: I825b4978270720c3693e718f007040c033ccf58f --- .../android/appwidget/AppWidgetHostView.java | 36 ++------------- .../widget/RemoteCollectionItemsAdapter.java | 45 +++++++++++++++---- core/java/android/widget/RemoteViews.java | 4 +- .../android/widget/RemoteViewsAdapter.java | 7 ++- 4 files changed, 47 insertions(+), 45 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index ec181dac6b36..27f6a266597c 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -155,22 +155,6 @@ public class AppWidgetHostView extends FrameLayout implements AppWidgetHost.AppW mInteractionHandler = getHandler(handler); } - /** - * @hide - */ - public static class AdapterChildHostView extends AppWidgetHostView { - - public AdapterChildHostView(Context context) { - super(context); - } - - @Override - public Context getRemoteContextEnsuringCorrectCachedApkPath() { - // To reduce noise in error messages - return null; - } - } - /** * Set the AppWidget that will be displayed by this view. This method also adds default padding * to widgets, as described in {@link #getDefaultPaddingForWidget(Context, ComponentName, Rect)} @@ -937,31 +921,17 @@ public class AppWidgetHostView extends FrameLayout implements AppWidgetHost.AppW setColorResources(RemoteViews.ColorResources.create(mContext, colorMapping)); } - private void setColorResourcesStates(RemoteViews.ColorResources colorResources) { - mColorResources = colorResources; - mColorMappingChanged = true; - mViewMode = VIEW_MODE_NOINIT; - } - /** @hide **/ public void setColorResources(RemoteViews.ColorResources colorResources) { if (colorResources == mColorResources) { return; } - setColorResourcesStates(colorResources); + mColorResources = colorResources; + mColorMappingChanged = true; + mViewMode = VIEW_MODE_NOINIT; reapplyLastRemoteViews(); } - /** - * @hide - */ - public void setColorResourcesNoReapply(RemoteViews.ColorResources colorResources) { - if (colorResources == mColorResources) { - return; - } - setColorResourcesStates(colorResources); - } - /** Check if, in the current context, the two color mappings are equivalent. */ private boolean isSameColorMapping(SparseIntArray oldColors, SparseIntArray newColors) { if (oldColors.size() != newColors.size()) { diff --git a/core/java/android/widget/RemoteCollectionItemsAdapter.java b/core/java/android/widget/RemoteCollectionItemsAdapter.java index 9b396aeea9eb..d84330828bf7 100644 --- a/core/java/android/widget/RemoteCollectionItemsAdapter.java +++ b/core/java/android/widget/RemoteCollectionItemsAdapter.java @@ -18,7 +18,6 @@ package android.widget; import android.annotation.NonNull; import android.annotation.Nullable; -import android.appwidget.AppWidgetHostView; import android.util.SparseIntArray; import android.view.View; import android.view.ViewGroup; @@ -26,6 +25,8 @@ import android.widget.RemoteViews.ColorResources; import android.widget.RemoteViews.InteractionHandler; import android.widget.RemoteViews.RemoteCollectionItems; +import com.android.internal.R; + import java.util.stream.IntStream; /** @@ -177,14 +178,40 @@ class RemoteCollectionItemsAdapter extends BaseAdapter { RemoteViews item = mItems.getItemView(position); item.addFlags(RemoteViews.FLAG_WIDGET_IS_COLLECTION_CHILD); + View reapplyView = getViewToReapply(convertView, item); + + // Reapply the RemoteViews if we can. + if (reapplyView != null) { + try { + item.reapply( + parent.getContext(), + reapplyView, + mInteractionHandler, + null /* size */, + mColorResources); + return reapplyView; + } catch (RuntimeException e) { + // We can't reapply for some reason, we'll fallback to an apply and inflate a + // new view. + } + } + + return item.apply( + parent.getContext(), + parent, + mInteractionHandler, + null /* size */, + mColorResources); + } + + /** Returns {@code convertView} if it can be used to reapply {@code item}, or null otherwise. */ + @Nullable + private static View getViewToReapply(@Nullable View convertView, @NonNull RemoteViews item) { + if (convertView == null) return null; + + Object layoutIdTag = convertView.getTag(R.id.widget_frame); + if (!(layoutIdTag instanceof Integer)) return null; - AppWidgetHostView newView = convertView instanceof AppWidgetHostView.AdapterChildHostView - widgetChildView - ? widgetChildView - : new AppWidgetHostView.AdapterChildHostView(parent.getContext()); - newView.setInteractionHandler(mInteractionHandler); - newView.setColorResourcesNoReapply(mColorResources); - newView.updateAppWidget(item); - return newView; + return item.getLayoutId() == (Integer) layoutIdTag ? convertView : null; } } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 87e163a068bf..7f96266a1f69 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -6687,13 +6687,13 @@ public class RemoteViews implements Parcelable, Filter { View parent = (View) view.getParent(); // Break the for loop on the first encounter of: // 1) an AdapterView, - // 2) an AppWidgetHostView that is not a child of an adapter view, or + // 2) an AppWidgetHostView that is not a RemoteViewsFrameLayout, or // 3) a null parent. // 2) and 3) are unexpected and catch the case where a child is not // correctly parented in an AdapterView. while (parent != null && !(parent instanceof AdapterView<?>) && !((parent instanceof AppWidgetHostView) - && !(parent instanceof AppWidgetHostView.AdapterChildHostView))) { + && !(parent instanceof RemoteViewsAdapter.RemoteViewsFrameLayout))) { parent = (View) parent.getParent(); } diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index 2f28a8704cd3..61a7599e8f73 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -368,7 +368,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback * A FrameLayout which contains a loading view, and manages the re/applying of RemoteViews when * they are loaded. */ - static class RemoteViewsFrameLayout extends AppWidgetHostView.AdapterChildHostView { + static class RemoteViewsFrameLayout extends AppWidgetHostView { private final FixedSizeRemoteViewsCache mCache; public int cacheIndex = -1; @@ -407,6 +407,11 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback return loadingTextView; } + @Override + protected Context getRemoteContextEnsuringCorrectCachedApkPath() { + return null; + } + @Override protected View getErrorView() { // Use the default loading view as the error view. -- GitLab