diff options
author | Sihua Ma <sihua@google.com> | 2024-01-16 18:13:33 +0000 |
---|---|---|
committer | Android Build Cherrypicker Worker <android-build-cherrypicker-worker@google.com> | 2024-01-16 18:13:33 +0000 |
commit | 28dcae492cc91182e3242a4fb6ef5b65a67637db (patch) | |
tree | 63a1f2506d9bac9b475d73e93a84cb274684e25b | |
parent | 7eca4e3f0c6f591d7bdae166196a0296604c7672 (diff) | |
download | base-28dcae492cc91182e3242a4fb6ef5b65a67637db.tar.gz |
Making adapter child views in RemoteCollectionItemsAdapter size-aware
This helps fix issues with improper layouts of
adapter child views in case
RemoteCollecionItemsAdapter is used.
Test: Manual
Bug: 245950570
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:dc464d6e522eebec5221a934ec3ff5f52a4fb90e)
Merged-In: I0eedf4574975bfae88801e0153816135fc1c8181
Change-Id: I0eedf4574975bfae88801e0153816135fc1c8181
4 files changed, 45 insertions, 47 deletions
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 27f6a266597c..ec181dac6b36 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -156,6 +156,22 @@ public class AppWidgetHostView extends FrameLayout implements AppWidgetHost.AppW } /** + * @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)} * and can be overridden in order to add custom padding. @@ -921,17 +937,31 @@ 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; } - mColorResources = colorResources; - mColorMappingChanged = true; - mViewMode = VIEW_MODE_NOINIT; + setColorResourcesStates(colorResources); 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 d84330828bf7..9b396aeea9eb 100644 --- a/core/java/android/widget/RemoteCollectionItemsAdapter.java +++ b/core/java/android/widget/RemoteCollectionItemsAdapter.java @@ -18,6 +18,7 @@ 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; @@ -25,8 +26,6 @@ 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; /** @@ -178,40 +177,14 @@ 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; - return item.getLayoutId() == (Integer) layoutIdTag ? convertView : 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; } } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 7f96266a1f69..87e163a068bf 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 RemoteViewsFrameLayout, or + // 2) an AppWidgetHostView that is not a child of an adapter view, 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 RemoteViewsAdapter.RemoteViewsFrameLayout))) { + && !(parent instanceof AppWidgetHostView.AdapterChildHostView))) { parent = (View) parent.getParent(); } diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index 61a7599e8f73..2f28a8704cd3 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 { + static class RemoteViewsFrameLayout extends AppWidgetHostView.AdapterChildHostView { private final FixedSizeRemoteViewsCache mCache; public int cacheIndex = -1; @@ -408,11 +408,6 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback } @Override - protected Context getRemoteContextEnsuringCorrectCachedApkPath() { - return null; - } - - @Override protected View getErrorView() { // Use the default loading view as the error view. return getDefaultView(); |