summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSihua Ma <sihua@google.com>2024-01-16 21:58:42 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-01-16 21:58:42 +0000
commit83b74c074b815fd410ba0c009f7e7355b4822a9e (patch)
tree63a1f2506d9bac9b475d73e93a84cb274684e25b
parent7eca4e3f0c6f591d7bdae166196a0296604c7672 (diff)
parent28dcae492cc91182e3242a4fb6ef5b65a67637db (diff)
downloadbase-83b74c074b815fd410ba0c009f7e7355b4822a9e.tar.gz
Merge "Making adapter child views in RemoteCollectionItemsAdapter size-aware" into android14-tests-dev
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java36
-rw-r--r--core/java/android/widget/RemoteCollectionItemsAdapter.java45
-rw-r--r--core/java/android/widget/RemoteViews.java4
-rw-r--r--core/java/android/widget/RemoteViewsAdapter.java7
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();