Postpone accessibility events to post layout

During a layout calculation, some accessibility events
might be triggered by the view system synchronously.
These events are very hard to handle for a LayoutManager
since it is in the middle of calculating a layout but
received an accessibility request while trying to
obtain / add or remove a View.

Instead, RecyclerView will silently block these calls
until the end of the layout or scroll calculation and
then dispatch content change to avoid these race
conditions.

This CL also backports more Accessibility code to support
library.

Bug: 19717689
Change-Id: I98aac9264579714352554a7e9cbd2f712a72e6ee
diff --git a/v4/api/current.txt b/v4/api/current.txt
index 031ef97..1745efc 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -1487,6 +1487,12 @@
     method public abstract T[] newArray(int);
   }
 
+  public class TraceCompat {
+    ctor public TraceCompat();
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
 }
 
 package android.support.v4.print {
@@ -2301,6 +2307,7 @@
   }
 
   public class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
     method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
     method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
     method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
@@ -2398,8 +2405,14 @@
   public class AccessibilityEventCompat {
     method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
     method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
     method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
     method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
     field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
     field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
     field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000