From b880d167a6ba6ce90c0c52c44bc775627150cdb8 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 24 Feb 2016 14:38:59 -0800 Subject: [PATCH] Fixing the parent check loop to allow RemoteViewsFrameLayout Bug: 27328093 Change-Id: I0f6ae8e95f952d40589eafb912ba188d15d7624c --- core/java/android/widget/RemoteViews.java | 11 +++++++++-- core/java/android/widget/RemoteViewsAdapter.java | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 914ffdf8b1e9..1cccfaeb7dc3 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -454,12 +454,19 @@ public class RemoteViews implements Parcelable, Filter { public void onClick(View v) { // Insure that this view is a child of an AdapterView View parent = (View) v.getParent(); + // Break the for loop on the first encounter of: + // 1) an AdapterView, + // 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) && + !(parent instanceof RemoteViewsAdapter.RemoteViewsFrameLayout))) { parent = (View) parent.getParent(); } - if (parent instanceof AppWidgetHostView || parent == null) { + if (!(parent instanceof AdapterView)) { // Somehow they've managed to get this far without having // and AdapterView as a parent. Log.e(LOG_TAG, "Collection item doesn't have AdapterView parent"); diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index 8278c5af92cb..10abbab6aacd 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -288,7 +288,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. */ - private static class RemoteViewsFrameLayout extends AppWidgetHostView { + static class RemoteViewsFrameLayout extends AppWidgetHostView { private final FixedSizeRemoteViewsCache mCache; public RemoteViewsFrameLayout(Context context, FixedSizeRemoteViewsCache cache) { -- 2.11.0