Update accessibility compat classes for N.

Adding getTitle and getAnchor to AccessibilityWindowInfoCompat.

Adding getDrawingOrder, setDrawingOrder, isImportantForAccessibility,
and setImportantForAccessibility to AccessibilityNodeInfoCompat.

Updating API and making CompatApi24 classes package private.

Bug: 28912621
Change-Id: I30cf7567abf1535f35b5176b9fe4c644ce4d2d72
diff --git a/v4/api/current.txt b/v4/api/current.txt
index d36c8e9..bda93c5 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -2966,6 +2966,7 @@
     method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
     method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
     method public java.lang.CharSequence getContentDescription();
+    method public int getDrawingOrder();
     method public java.lang.CharSequence getError();
     method public android.os.Bundle getExtras();
     method public java.lang.Object getInfo();
@@ -2997,6 +2998,7 @@
     method public boolean isEnabled();
     method public boolean isFocusable();
     method public boolean isFocused();
+    method public boolean isImportantForAccessibility();
     method public boolean isLongClickable();
     method public boolean isMultiLine();
     method public boolean isPassword();
@@ -3027,11 +3029,13 @@
     method public void setContentDescription(java.lang.CharSequence);
     method public void setContentInvalid(boolean);
     method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
     method public void setEditable(boolean);
     method public void setEnabled(boolean);
     method public void setError(java.lang.CharSequence);
     method public void setFocusable(boolean);
     method public void setFocused(boolean);
+    method public void setImportantForAccessibility(boolean);
     method public void setInputType(int);
     method public void setLabelFor(android.view.View);
     method public void setLabelFor(android.view.View, int);
@@ -3217,6 +3221,7 @@
   }
 
   public class AccessibilityWindowInfoCompat {
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
     method public void getBoundsInScreen(android.graphics.Rect);
     method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
     method public int getChildCount();
@@ -3224,6 +3229,7 @@
     method public int getLayer();
     method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
     method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
+    method public java.lang.CharSequence getTitle();
     method public int getType();
     method public boolean isAccessibilityFocused();
     method public boolean isActive();
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java b/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
new file mode 100644
index 0000000..dedf88d
--- /dev/null
+++ b/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Api24-specific AccessibilityNodeInfo API implementation.
+ */
+class AccessibilityNodeInfoCompatApi24 {
+    public static int getDrawingOrder(Object info) {
+        return ((AccessibilityNodeInfo) info).getDrawingOrder();
+    }
+
+    public static void setDrawingOrder(Object info, int drawingOrderInParent) {
+        ((AccessibilityNodeInfo) info).setDrawingOrder(drawingOrderInParent);
+    }
+
+    public static boolean isImportantForAccessibility(Object info) {
+        return ((AccessibilityNodeInfo) info).isImportantForAccessibility();
+    }
+
+    public static void setImportantForAccessibility(Object info,
+            boolean importantForAccessibility) {
+        ((AccessibilityNodeInfo) info).setImportantForAccessibility(importantForAccessibility);
+    }
+}
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java b/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
new file mode 100644
index 0000000..34ba542
--- /dev/null
+++ b/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityWindowInfo;
+
+/**
+ * Api24-specific AccessibilityWindowInfo API implementation.
+ */
+class AccessibilityWindowInfoCompatApi24 {
+    public static CharSequence getTitle(Object info) {
+        return ((AccessibilityWindowInfo) info).getTitle();
+    }
+
+    public static Object getAnchor(Object info) {
+        return ((AccessibilityWindowInfo) info).getAnchor();
+    }
+}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
index b894ad80..5bd94e4 100644
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -609,6 +609,10 @@
         public void setDismissable(Object info, boolean dismissable);
         public boolean isEditable(Object info);
         public void setEditable(Object info, boolean editable);
+        public int getDrawingOrder(Object info);
+        public void setDrawingOrder(Object info, int drawingOrderInParent);
+        public boolean isImportantForAccessibility(Object info);
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility);
         public boolean isMultiLine(Object info);
         public void setMultiLine(Object info, boolean multiLine);
         public boolean refresh(Object info);
@@ -1227,6 +1231,24 @@
         @Override
         public void setRoleDescription(Object info, CharSequence roleDescription) {
         }
+
+        @Override
+        public int getDrawingOrder(Object info) {
+            return 0;
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return true;
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+        }
     }
 
     static class AccessibilityNodeInfoIcsImpl extends AccessibilityNodeInfoStubImpl {
@@ -1895,8 +1917,34 @@
         }
     }
 
+    static class AccessibilityNodeInfoApi24Impl extends AccessibilityNodeInfoApi22Impl {
+        @Override
+        public int getDrawingOrder(Object info) {
+            return AccessibilityNodeInfoCompatApi24.getDrawingOrder(info);
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+            AccessibilityNodeInfoCompatApi24.setDrawingOrder(info, drawingOrderInParent);
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return AccessibilityNodeInfoCompatApi24.isImportantForAccessibility(info);
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+            AccessibilityNodeInfoCompatApi24.setImportantForAccessibility(
+                    info, importantForAccessibility);
+        }
+
+    }
+
     static {
-        if (Build.VERSION.SDK_INT >= 22) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityNodeInfoApi24Impl();
+        } else if (Build.VERSION.SDK_INT >= 22) {
             IMPL = new AccessibilityNodeInfoApi22Impl();
         } else if (Build.VERSION.SDK_INT >= 21) {
             IMPL = new AccessibilityNodeInfoApi21Impl();
@@ -3025,6 +3073,33 @@
     }
 
     /**
+     * Returns whether the node originates from a view considered important for accessibility.
+     *
+     * @return {@code true} if the node originates from a view considered important for
+     *         accessibility, {@code false} otherwise
+     *
+     * @see View#isImportantForAccessibility()
+     */
+    public boolean isImportantForAccessibility() {
+        return IMPL.isImportantForAccessibility(mInfo);
+    }
+
+    /**
+     * Sets whether the node is considered important for accessibility.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param important {@code true} if the node is considered important for accessibility,
+     *                  {@code false} otherwise
+     */
+    public void setImportantForAccessibility(boolean important) {
+        IMPL.setImportantForAccessibility(mInfo, important);
+    }
+
+    /**
      * Gets the package this node comes from.
      *
      * @return The package name.
@@ -3201,6 +3276,36 @@
     }
 
     /**
+     * Get the drawing order of the view corresponding it this node.
+     * <p>
+     * Drawing order is determined only within the node's parent, so this index is only relative
+     * to its siblings.
+     * <p>
+     * In some cases, the drawing order is essentially simultaneous, so it is possible for two
+     * siblings to return the same value. It is also possible that values will be skipped.
+     *
+     * @return The drawing position of the view corresponding to this node relative to its siblings.
+     */
+    public int getDrawingOrder() {
+        return IMPL.getDrawingOrder(mInfo);
+    }
+
+    /**
+     * Set the drawing order of the view corresponding it this node.
+     *
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     * @param drawingOrderInParent
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setDrawingOrder(int drawingOrderInParent) {
+        IMPL.setDrawingOrder(mInfo, drawingOrderInParent);
+    }
+
+    /**
      * Gets the collection info if the node is a collection. A collection
      * child is always a collection item.
      *
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
index 3197bb1..738924c 100644
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
+++ b/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
@@ -39,10 +39,12 @@
         public boolean isAccessibilityFocused(Object info);
         public int getChildCount(Object info);
         public Object getChild(Object info, int index);
+        public CharSequence getTitle(Object info);
+        public Object getAnchor(Object info);
         public void recycle(Object info);
     }
 
-    private static class AccessibilityWindowInfoStubImpl implements  AccessibilityWindowInfoImpl {
+    private static class AccessibilityWindowInfoStubImpl implements AccessibilityWindowInfoImpl {
 
         @Override
         public Object obtain() {
@@ -111,6 +113,16 @@
         @Override
         public void recycle(Object info) {
         }
+
+        @Override
+        public CharSequence getTitle(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return null;
+        }
     }
 
     private static class AccessibilityWindowInfoApi21Impl extends AccessibilityWindowInfoStubImpl {
@@ -185,8 +197,22 @@
         }
     }
 
+    private static class AccessibilityWindowInfoApi24Impl extends AccessibilityWindowInfoApi21Impl {
+        @Override
+        public CharSequence getTitle(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getTitle(info);
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getAnchor(info);
+        }
+    }
+
     static {
-        if (Build.VERSION.SDK_INT >= 21) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityWindowInfoApi24Impl();
+        } else  if (Build.VERSION.SDK_INT >= 21) {
             IMPL = new AccessibilityWindowInfoApi21Impl();
         } else {
             IMPL = new AccessibilityWindowInfoStubImpl();
@@ -355,6 +381,25 @@
     }
 
     /**
+     * Gets the title of the window.
+     *
+     * @return The title of the window, or the application label for the window if no title was
+     * explicitly set, or {@code null} if neither is available.
+     */
+    public CharSequence getTitle() {
+        return IMPL.getTitle(mInfo);
+    }
+
+    /**
+     * Gets the node that anchors this window to another.
+     *
+     * @return The anchor node, or {@code null} if none exists.
+     */
+    public AccessibilityNodeInfoCompat getAnchor() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getAnchor(mInfo));
+    }
+
+    /**
      * Returns a cached instance if such is available or a new one is
      * created.
      *