Clear accessibility delegete from recycled views

When a view is recycled, RecyclerView should clean the accessibility
delegate. Not doing so was causing problems if View is added to
another container which is not a Collection

Bug: 17739472

Change-Id: I45c5895342f33fa485daae178ad508bda0fb4f68
diff --git a/v4/Android.mk b/v4/Android.mk
index dbebab4..a43a5cc 100644
--- a/v4/Android.mk
+++ b/v4/Android.mk
@@ -19,6 +19,7 @@
 LOCAL_MODULE := android-support-v4-donut
 LOCAL_SDK_VERSION := 4
 LOCAL_SRC_FILES := $(call all-java-files-under, donut)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-annotations
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
 # -----------------------------------------------------------------------
@@ -183,5 +184,4 @@
     $(call all-Iaidl-files-under, java)
 
 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4-api21
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-annotations
 include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v4/build.gradle b/v4/build.gradle
index fed5c24..eb3b601 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -55,6 +55,7 @@
 
 dependencies {
     compile project(':support-annotations')
+    donutCompile project(':support-annotations')
 
     // add the internal implementation as a dependency.
     // this is not enough to make the regular compileJava task
diff --git a/v4/ics/android/support/v4/view/ViewCompatICS.java b/v4/ics/android/support/v4/view/ViewCompatICS.java
index 82aeaf3..da7929c 100644
--- a/v4/ics/android/support/v4/view/ViewCompatICS.java
+++ b/v4/ics/android/support/v4/view/ViewCompatICS.java
@@ -16,6 +16,7 @@
 
 package android.support.v4.view;
 
+import android.support.annotation.Nullable;
 import android.view.View;
 import android.view.View.AccessibilityDelegate;
 import android.view.accessibility.AccessibilityEvent;
@@ -34,7 +35,7 @@
         return v.canScrollVertically(direction);
     }
 
-    public static void setAccessibilityDelegate(View v, Object delegate) {
+    public static void setAccessibilityDelegate(View v, @Nullable Object delegate) {
         v.setAccessibilityDelegate((AccessibilityDelegate) delegate);
     }
 
diff --git a/v4/java/android/support/v4/view/ViewCompat.java b/v4/java/android/support/v4/view/ViewCompat.java
index a8445c9..aa3bd00 100644
--- a/v4/java/android/support/v4/view/ViewCompat.java
+++ b/v4/java/android/support/v4/view/ViewCompat.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.support.annotation.IdRes;
 import android.support.annotation.IntDef;
+import android.support.annotation.Nullable;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
 import android.util.Log;
@@ -261,7 +262,7 @@
         public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
         public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
         public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
-        public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate);
+        public void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
         public boolean hasAccessibilityDelegate(View v);
         public boolean hasTransientState(View view);
         public void setHasTransientState(View view, boolean hasTransientState);
@@ -930,8 +931,10 @@
             ViewCompatICS.onInitializeAccessibilityNodeInfo(v, info.getInfo());
         }
         @Override
-        public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
-            ViewCompatICS.setAccessibilityDelegate(v, delegate.getBridge());
+        public void setAccessibilityDelegate(View v,
+                @Nullable AccessibilityDelegateCompat delegate) {
+            ViewCompatICS.setAccessibilityDelegate(v,
+                    delegate == null ? null : delegate.getBridge());
         }
 
         @Override
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 149a1df..0149f2c 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -3483,8 +3483,7 @@
                 Log.d(TAG, "CachedViewHolder to be recycled(if recycleable): " + viewHolder);
             }
             if (viewHolder.isRecyclable()) {
-                getRecycledViewPool().putRecycledView(viewHolder);
-                dispatchViewRecycled(viewHolder);
+                addViewHolderToRecycledViewPool(viewHolder);
                 mCachedViews.remove(cachedViewIndex);
                 return true;
             }
@@ -3508,6 +3507,7 @@
                 throw new IllegalArgumentException("Trying to recycle an ignored view holder. You"
                         + " should first call stopIgnoringView(view) before calling recycle.");
             }
+
             if (holder.isRecyclable()) {
                 boolean cached = false;
                 if (!holder.isInvalid() && (mState.mInPreLayout || !holder.isRemoved()) &&
@@ -3526,8 +3526,7 @@
                     }
                 }
                 if (!cached) {
-                    getRecycledViewPool().putRecycledView(holder);
-                    dispatchViewRecycled(holder);
+                    addViewHolderToRecycledViewPool(holder);
                 }
             } else if (DEBUG) {
                 Log.d(TAG, "trying to recycle a non-recycleable holder. Hopefully, it will "
@@ -3538,6 +3537,12 @@
             mState.onViewRecycled(holder);
         }
 
+        void addViewHolderToRecycledViewPool(ViewHolder holder) {
+            ViewCompat.setAccessibilityDelegate(holder.itemView, null);
+            getRecycledViewPool().putRecycledView(holder);
+            dispatchViewRecycled(holder);
+        }
+
         /**
          * Used as a fast path for unscrapping and recycling a view during a bulk operation.
          * The caller must call {@link #clearScrap()} when it's done to update the recycler's