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