Merge "Remove unused ExploreByTouchHelper class"
diff --git a/src/com/android/settings/widget/ExploreByTouchHelper.java b/src/com/android/settings/widget/ExploreByTouchHelper.java
deleted file mode 100644
index b64a74c..0000000
--- a/src/com/android/settings/widget/ExploreByTouchHelper.java
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- * Copyright (C) 2013 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 com.android.settings.widget;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.accessibility.AccessibilityNodeProvider;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Copied from setup wizard, which is in turn a modified copy of
- * com.android.internal.ExploreByTouchHelper with the following modifications:
- *
- * - Make accessibility calls to the views, instead of to the accessibility delegate directly to
- *   make sure those methods for View subclasses are called.
- *
- * ExploreByTouchHelper is a utility class for implementing accessibility
- * support in custom {@link android.view.View}s that represent a collection of View-like
- * logical items. It extends {@link android.view.accessibility.AccessibilityNodeProvider} and
- * simplifies many aspects of providing information to accessibility services
- * and managing accessibility focus. This class does not currently support
- * hierarchies of logical items.
- * <p>
- * This should be applied to the parent view using
- * {@link android.view.View#setAccessibilityDelegate}:
- *
- * <pre>
- * mAccessHelper = ExploreByTouchHelper.create(someView, mAccessHelperCallback);
- * ViewCompat.setAccessibilityDelegate(someView, mAccessHelper);
- * </pre>
- */
-public abstract class ExploreByTouchHelper extends View.AccessibilityDelegate {
-    /** Virtual node identifier value for invalid nodes. */
-    public static final int INVALID_ID = Integer.MIN_VALUE;
-
-    /** Default class name used for virtual views. */
-    private static final String DEFAULT_CLASS_NAME = View.class.getName();
-
-    // Temporary, reusable data structures.
-    private final Rect mTempScreenRect = new Rect();
-    private final Rect mTempParentRect = new Rect();
-    private final Rect mTempVisibleRect = new Rect();
-    private final int[] mTempGlobalRect = new int[2];
-
-    /** View's context **/
-    private Context mContext;
-
-    /** System accessibility manager, used to check state and send events. */
-    private final AccessibilityManager mManager;
-
-    /** View whose internal structure is exposed through this helper. */
-    private final View mView;
-
-    /** Node provider that handles creating nodes and performing actions. */
-    private ExploreByTouchNodeProvider mNodeProvider;
-
-    /** Virtual view id for the currently focused logical item. */
-    private int mFocusedVirtualViewId = INVALID_ID;
-
-    /** Virtual view id for the currently hovered logical item. */
-    private int mHoveredVirtualViewId = INVALID_ID;
-
-    /**
-     * Factory method to create a new {@link com.google.android.setupwizard.util.ExploreByTouchHelper}.
-     *
-     * @param forView View whose logical children are exposed by this helper.
-     */
-    public ExploreByTouchHelper(View forView) {
-        if (forView == null) {
-            throw new IllegalArgumentException("View may not be null");
-        }
-
-        mView = forView;
-        mContext = forView.getContext();
-        mManager = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
-    }
-
-    /**
-     * Returns the {@link android.view.accessibility.AccessibilityNodeProvider} for this helper.
-     *
-     * @param host View whose logical children are exposed by this helper.
-     * @return The accessibility node provider for this helper.
-     */
-    @Override
-    public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) {
-        if (mNodeProvider == null) {
-            mNodeProvider = new ExploreByTouchNodeProvider();
-        }
-        return mNodeProvider;
-    }
-
-    /**
-     * Dispatches hover {@link android.view.MotionEvent}s to the virtual view hierarchy when
-     * the Explore by Touch feature is enabled.
-     * <p>
-     * This method should be called by overriding
-     * {@link android.view.View#dispatchHoverEvent}:
-     *
-     * <pre>&#64;Override
-     * public boolean dispatchHoverEvent(MotionEvent event) {
-     *   if (mHelper.dispatchHoverEvent(this, event) {
-     *     return true;
-     *   }
-     *   return super.dispatchHoverEvent(event);
-     * }
-     * </pre>
-     *
-     * @param event The hover event to dispatch to the virtual view hierarchy.
-     * @return Whether the hover event was handled.
-     */
-    public boolean dispatchHoverEvent(MotionEvent event) {
-        if (!mManager.isEnabled() || !mManager.isTouchExplorationEnabled()) {
-            return false;
-        }
-
-        switch (event.getAction()) {
-            case MotionEvent.ACTION_HOVER_MOVE:
-            case MotionEvent.ACTION_HOVER_ENTER:
-                final int virtualViewId = getVirtualViewAt(event.getX(), event.getY());
-                updateHoveredVirtualView(virtualViewId);
-                return (virtualViewId != INVALID_ID);
-            case MotionEvent.ACTION_HOVER_EXIT:
-                if (mFocusedVirtualViewId != INVALID_ID) {
-                    updateHoveredVirtualView(INVALID_ID);
-                    return true;
-                }
-                return false;
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Populates an event of the specified type with information about an item
-     * and attempts to send it up through the view hierarchy.
-     * <p>
-     * You should call this method after performing a user action that normally
-     * fires an accessibility event, such as clicking on an item.
-     *
-     * <pre>public void performItemClick(T item) {
-     *   ...
-     *   sendEventForVirtualViewId(item.id, AccessibilityEvent.TYPE_VIEW_CLICKED);
-     * }
-     * </pre>
-     *
-     * @param virtualViewId The virtual view id for which to send an event.
-     * @param eventType The type of event to send.
-     * @return true if the event was sent successfully.
-     */
-    public boolean sendEventForVirtualView(int virtualViewId, int eventType) {
-        if ((virtualViewId == INVALID_ID) || !mManager.isEnabled()) {
-            return false;
-        }
-
-        final ViewParent parent = mView.getParent();
-        if (parent == null) {
-            return false;
-        }
-
-        final AccessibilityEvent event = createEvent(virtualViewId, eventType);
-        return parent.requestSendAccessibilityEvent(mView, event);
-    }
-
-    /**
-     * Notifies the accessibility framework that the properties of the parent
-     * view have changed.
-     * <p>
-     * You <b>must</b> call this method after adding or removing items from the
-     * parent view.
-     */
-    public void invalidateRoot() {
-        invalidateVirtualView(View.NO_ID);
-    }
-
-    /**
-     * Notifies the accessibility framework that the properties of a particular
-     * item have changed.
-     * <p>
-     * You <b>must</b> call this method after changing any of the properties set
-     * in {@link #onPopulateNodeForVirtualView}.
-     *
-     * @param virtualViewId The virtual view id to invalidate.
-     */
-    public void invalidateVirtualView(int virtualViewId) {
-        sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
-    }
-
-    /**
-     * Returns the virtual view id for the currently focused item,
-     *
-     * @return A virtual view id, or {@link #INVALID_ID} if no item is
-     *         currently focused.
-     */
-    public int getFocusedVirtualView() {
-        return mFocusedVirtualViewId;
-    }
-
-    /**
-     * Sets the currently hovered item, sending hover accessibility events as
-     * necessary to maintain the correct state.
-     *
-     * @param virtualViewId The virtual view id for the item currently being
-     *            hovered, or {@link #INVALID_ID} if no item is hovered within
-     *            the parent view.
-     */
-    private void updateHoveredVirtualView(int virtualViewId) {
-        if (mHoveredVirtualViewId == virtualViewId) {
-            return;
-        }
-
-        final int previousVirtualViewId = mHoveredVirtualViewId;
-        mHoveredVirtualViewId = virtualViewId;
-
-        // Stay consistent with framework behavior by sending ENTER/EXIT pairs
-        // in reverse order. This is accurate as of API 18.
-        sendEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_HOVER_ENTER);
-        sendEventForVirtualView(previousVirtualViewId, AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityEvent} for the specified
-     * virtual view id, which includes the host view ({@link android.view.View#NO_ID}).
-     *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct an event.
-     * @param eventType The type of event to construct.
-     * @return An {@link android.view.accessibility.AccessibilityEvent} populated with information about
-     *         the specified item.
-     */
-    private AccessibilityEvent createEvent(int virtualViewId, int eventType) {
-        switch (virtualViewId) {
-            case View.NO_ID:
-                return createEventForHost(eventType);
-            default:
-                return createEventForChild(virtualViewId, eventType);
-        }
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityEvent} for the host node.
-     *
-     * @param eventType The type of event to construct.
-     * @return An {@link android.view.accessibility.AccessibilityEvent} populated with information about
-     *         the specified item.
-     */
-    private AccessibilityEvent createEventForHost(int eventType) {
-        final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
-        mView.onInitializeAccessibilityEvent(event);
-        return event;
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityEvent} populated with
-     * information about the specified item.
-     *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct an event.
-     * @param eventType The type of event to construct.
-     * @return An {@link android.view.accessibility.AccessibilityEvent} populated with information about
-     *         the specified item.
-     */
-    private AccessibilityEvent createEventForChild(int virtualViewId, int eventType) {
-        final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
-        event.setEnabled(true);
-        event.setClassName(DEFAULT_CLASS_NAME);
-
-        // Allow the client to populate the event.
-        onPopulateEventForVirtualView(virtualViewId, event);
-
-        // Make sure the developer is following the rules.
-        if (event.getText().isEmpty() && (event.getContentDescription() == null)) {
-            throw new RuntimeException("Callbacks must add text or a content description in "
-                    + "populateEventForVirtualViewId()");
-        }
-
-        // Don't allow the client to override these properties.
-        event.setPackageName(mView.getContext().getPackageName());
-        event.setSource(mView, virtualViewId);
-
-        return event;
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityNodeInfo} for the
-     * specified virtual view id, which includes the host view
-     * ({@link android.view.View#NO_ID}).
-     *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            construct a node.
-     * @return An {@link android.view.accessibility.AccessibilityNodeInfo} populated with information
-     *         about the specified item.
-     */
-    private AccessibilityNodeInfo createNode(int virtualViewId) {
-        switch (virtualViewId) {
-            case View.NO_ID:
-                return createNodeForHost();
-            default:
-                return createNodeForChild(virtualViewId);
-        }
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityNodeInfo} for the
-     * host view populated with its virtual descendants.
-     *
-     * @return An {@link android.view.accessibility.AccessibilityNodeInfo} for the parent node.
-     */
-    private AccessibilityNodeInfo createNodeForHost() {
-        final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain(mView);
-        mView.onInitializeAccessibilityNodeInfo(node);
-
-        // Add the virtual descendants.
-        final LinkedList<Integer> virtualViewIds = new LinkedList<Integer>();
-        getVisibleVirtualViews(virtualViewIds);
-
-        for (Integer childVirtualViewId : virtualViewIds) {
-            node.addChild(mView, childVirtualViewId);
-        }
-
-        return node;
-    }
-
-    /**
-     * Constructs and returns an {@link android.view.accessibility.AccessibilityNodeInfo} for the
-     * specified item. Automatically manages accessibility focus actions.
-     * <p>
-     * Allows the implementing class to specify most node properties, but
-     * overrides the following:
-     * <ul>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setPackageName}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setClassName}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setParent(android.view.View)}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setSource(android.view.View, int)}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setVisibleToUser}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInScreen(android.graphics.Rect)}
-     * </ul>
-     * <p>
-     * Uses the bounds of the parent view and the parent-relative bounding
-     * rectangle specified by
-     * {@link android.view.accessibility.AccessibilityNodeInfo#getBoundsInParent} to automatically
-     * update the following properties:
-     * <ul>
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setVisibleToUser}
-     * <li>{@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInParent}
-     * </ul>
-     *
-     * @param virtualViewId The virtual view id for item for which to construct
-     *            a node.
-     * @return An {@link android.view.accessibility.AccessibilityNodeInfo} for the specified item.
-     */
-    private AccessibilityNodeInfo createNodeForChild(int virtualViewId) {
-        final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain();
-
-        // Ensure the client has good defaults.
-        node.setEnabled(true);
-        node.setClassName(DEFAULT_CLASS_NAME);
-
-        // Allow the client to populate the node.
-        onPopulateNodeForVirtualView(virtualViewId, node);
-
-        // Make sure the developer is following the rules.
-        if ((node.getText() == null) && (node.getContentDescription() == null)) {
-            throw new RuntimeException("Callbacks must add text or a content description in "
-                    + "populateNodeForVirtualViewId()");
-        }
-
-        node.getBoundsInParent(mTempParentRect);
-        if (mTempParentRect.isEmpty()) {
-            throw new RuntimeException("Callbacks must set parent bounds in "
-                    + "populateNodeForVirtualViewId()");
-        }
-
-        final int actions = node.getActions();
-        if ((actions & AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS) != 0) {
-            throw new RuntimeException("Callbacks must not add ACTION_ACCESSIBILITY_FOCUS in "
-                    + "populateNodeForVirtualViewId()");
-        }
-        if ((actions & AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS) != 0) {
-            throw new RuntimeException("Callbacks must not add ACTION_CLEAR_ACCESSIBILITY_FOCUS in "
-                    + "populateNodeForVirtualViewId()");
-        }
-
-        // Don't allow the client to override these properties.
-        node.setPackageName(mView.getContext().getPackageName());
-        node.setSource(mView, virtualViewId);
-        node.setParent(mView);
-
-        // Manage internal accessibility focus state.
-        if (mFocusedVirtualViewId == virtualViewId) {
-            node.setAccessibilityFocused(true);
-            node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
-        } else {
-            node.setAccessibilityFocused(false);
-            node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
-        }
-
-        // Set the visibility based on the parent bound.
-        if (intersectVisibleToUser(mTempParentRect)) {
-            node.setVisibleToUser(true);
-            node.setBoundsInParent(mTempParentRect);
-        }
-
-        // Calculate screen-relative bound.
-        mView.getLocationOnScreen(mTempGlobalRect);
-        final int offsetX = mTempGlobalRect[0];
-        final int offsetY = mTempGlobalRect[1];
-        mTempScreenRect.set(mTempParentRect);
-        mTempScreenRect.offset(offsetX, offsetY);
-        node.setBoundsInScreen(mTempScreenRect);
-
-        return node;
-    }
-
-    private boolean performAction(int virtualViewId, int action, Bundle arguments) {
-        switch (virtualViewId) {
-            case View.NO_ID:
-                return performActionForHost(action, arguments);
-            default:
-                return performActionForChild(virtualViewId, action, arguments);
-        }
-    }
-
-    private boolean performActionForHost(int action, Bundle arguments) {
-        return mView.performAccessibilityAction(action, arguments);
-    }
-
-    private boolean performActionForChild(int virtualViewId, int action, Bundle arguments) {
-        switch (action) {
-            case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
-            case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
-                return manageFocusForChild(virtualViewId, action, arguments);
-            default:
-                return onPerformActionForVirtualView(virtualViewId, action, arguments);
-        }
-    }
-
-    private boolean manageFocusForChild(int virtualViewId, int action, Bundle arguments) {
-        switch (action) {
-            case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
-                return requestAccessibilityFocus(virtualViewId);
-            case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
-                return clearAccessibilityFocus(virtualViewId);
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Computes whether the specified {@link android.graphics.Rect} intersects with the visible
-     * portion of its parent {@link android.view.View}. Modifies {@code localRect} to contain
-     * only the visible portion.
-     *
-     * @param localRect A rectangle in local (parent) coordinates.
-     * @return Whether the specified {@link android.graphics.Rect} is visible on the screen.
-     */
-    private boolean intersectVisibleToUser(Rect localRect) {
-        // Missing or empty bounds mean this view is not visible.
-        if ((localRect == null) || localRect.isEmpty()) {
-            return false;
-        }
-
-        // Attached to invisible window means this view is not visible.
-        if (mView.getWindowVisibility() != View.VISIBLE) {
-            return false;
-        }
-
-        // An invisible predecessor means that this view is not visible.
-        ViewParent viewParent = mView.getParent();
-        while (viewParent instanceof View) {
-            final View view = (View) viewParent;
-            if ((view.getAlpha() <= 0) || (view.getVisibility() != View.VISIBLE)) {
-                return false;
-            }
-            viewParent = view.getParent();
-        }
-
-        // A null parent implies the view is not visible.
-        if (viewParent == null) {
-            return false;
-        }
-
-        // If no portion of the parent is visible, this view is not visible.
-        if (!mView.getLocalVisibleRect(mTempVisibleRect)) {
-            return false;
-        }
-
-        // Check if the view intersects the visible portion of the parent.
-        return localRect.intersect(mTempVisibleRect);
-    }
-
-    /**
-     * Returns whether this virtual view is accessibility focused.
-     *
-     * @return True if the view is accessibility focused.
-     */
-    private boolean isAccessibilityFocused(int virtualViewId) {
-        return (mFocusedVirtualViewId == virtualViewId);
-    }
-
-    /**
-     * Attempts to give accessibility focus to a virtual view.
-     * <p>
-     * A virtual view will not actually take focus if
-     * {@link android.view.accessibility.AccessibilityManager#isEnabled()} returns false,
-     * {@link android.view.accessibility.AccessibilityManager#isTouchExplorationEnabled()} returns false,
-     * or the view already has accessibility focus.
-     *
-     * @param virtualViewId The id of the virtual view on which to place
-     *            accessibility focus.
-     * @return Whether this virtual view actually took accessibility focus.
-     */
-    private boolean requestAccessibilityFocus(int virtualViewId) {
-        final AccessibilityManager accessibilityManager =
-                (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
-
-        if (!mManager.isEnabled()
-                || !accessibilityManager.isTouchExplorationEnabled()) {
-            return false;
-        }
-        // TODO: Check virtual view visibility.
-        if (!isAccessibilityFocused(virtualViewId)) {
-            mFocusedVirtualViewId = virtualViewId;
-            // TODO: Only invalidate virtual view bounds.
-            mView.invalidate();
-            sendEventForVirtualView(virtualViewId,
-                    AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Attempts to clear accessibility focus from a virtual view.
-     *
-     * @param virtualViewId The id of the virtual view from which to clear
-     *            accessibility focus.
-     * @return Whether this virtual view actually cleared accessibility focus.
-     */
-    private boolean clearAccessibilityFocus(int virtualViewId) {
-        if (isAccessibilityFocused(virtualViewId)) {
-            mFocusedVirtualViewId = INVALID_ID;
-            mView.invalidate();
-            sendEventForVirtualView(virtualViewId,
-                    AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Provides a mapping between view-relative coordinates and logical
-     * items.
-     *
-     * @param x The view-relative x coordinate
-     * @param y The view-relative y coordinate
-     * @return virtual view identifier for the logical item under
-     *         coordinates (x,y)
-     */
-    protected abstract int getVirtualViewAt(float x, float y);
-
-    /**
-     * Populates a list with the view's visible items. The ordering of items
-     * within {@code virtualViewIds} specifies order of accessibility focus
-     * traversal.
-     *
-     * @param virtualViewIds The list to populate with visible items
-     */
-    protected abstract void getVisibleVirtualViews(List<Integer> virtualViewIds);
-
-    /**
-     * Populates an {@link android.view.accessibility.AccessibilityEvent} with information about the
-     * specified item.
-     * <p>
-     * Implementations <b>must</b> populate the following required fields:
-     * <ul>
-     * <li>event text, see {@link android.view.accessibility.AccessibilityEvent#getText} or
-     * {@link android.view.accessibility.AccessibilityEvent#setContentDescription}
-     * </ul>
-     * <p>
-     * The helper class automatically populates the following fields with
-     * default values, but implementations may optionally override them:
-     * <ul>
-     * <li>item class name, set to android.view.View, see
-     * {@link android.view.accessibility.AccessibilityEvent#setClassName}
-     * </ul>
-     * <p>
-     * The following required fields are automatically populated by the
-     * helper class and may not be overridden:
-     * <ul>
-     * <li>package name, set to the package of the host view's
-     * {@link android.content.Context}, see {@link android.view.accessibility.AccessibilityEvent#setPackageName}
-     * <li>event source, set to the host view and virtual view identifier,
-     * see {@link android.view.accessibility.AccessibilityRecord#setSource(android.view.View, int)}
-     * </ul>
-     *
-     * @param virtualViewId The virtual view id for the item for which to
-     *            populate the event
-     * @param event The event to populate
-     */
-    protected abstract void onPopulateEventForVirtualView(
-            int virtualViewId, AccessibilityEvent event);
-
-    /**
-     * Populates an {@link android.view.accessibility.AccessibilityNodeInfo} with information
-     * about the specified item.
-     * <p>
-     * Implementations <b>must</b> populate the following required fields:
-     * <ul>
-     * <li>event text, see {@link android.view.accessibility.AccessibilityNodeInfo#setText} or
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setContentDescription}
-     * <li>bounds in parent coordinates, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInParent}
-     * </ul>
-     * <p>
-     * The helper class automatically populates the following fields with
-     * default values, but implementations may optionally override them:
-     * <ul>
-     * <li>enabled state, set to true, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setEnabled}
-     * <li>item class name, identical to the class name set by
-     * {@link #onPopulateEventForVirtualView}, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setClassName}
-     * </ul>
-     * <p>
-     * The following required fields are automatically populated by the
-     * helper class and may not be overridden:
-     * <ul>
-     * <li>package name, identical to the package name set by
-     * {@link #onPopulateEventForVirtualView}, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setPackageName}
-     * <li>node source, identical to the event source set in
-     * {@link #onPopulateEventForVirtualView}, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setSource(android.view.View, int)}
-     * <li>parent view, set to the host view, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setParent(android.view.View)}
-     * <li>visibility, computed based on parent-relative bounds, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setVisibleToUser}
-     * <li>accessibility focus, computed based on internal helper state, see
-     * {@link android.view.accessibility.AccessibilityNodeInfo#setAccessibilityFocused}
-     * <li>bounds in screen coordinates, computed based on host view bounds,
-     * see {@link android.view.accessibility.AccessibilityNodeInfo#setBoundsInScreen}
-     * </ul>
-     * <p>
-     * Additionally, the helper class automatically handles accessibility
-     * focus management by adding the appropriate
-     * {@link android.view.accessibility.AccessibilityNodeInfo#ACTION_ACCESSIBILITY_FOCUS} or
-     * {@link android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_ACCESSIBILITY_FOCUS}
-     * action. Implementations must <b>never</b> manually add these actions.
-     * <p>
-     * The helper class also automatically modifies parent- and
-     * screen-relative bounds to reflect the portion of the item visible
-     * within its parent.
-     *
-     * @param virtualViewId The virtual view identifier of the item for
-     *            which to populate the node
-     * @param node The node to populate
-     */
-    protected abstract void onPopulateNodeForVirtualView(
-            int virtualViewId, AccessibilityNodeInfo node);
-
-    /**
-     * Performs the specified accessibility action on the item associated
-     * with the virtual view identifier. See
-     * {@link android.view.accessibility.AccessibilityNodeInfo#performAction(int, android.os.Bundle)} for
-     * more information.
-     * <p>
-     * Implementations <b>must</b> handle any actions added manually in
-     * {@link #onPopulateNodeForVirtualView}.
-     * <p>
-     * The helper class automatically handles focus management resulting
-     * from {@link android.view.accessibility.AccessibilityNodeInfo#ACTION_ACCESSIBILITY_FOCUS}
-     * and
-     * {@link android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_ACCESSIBILITY_FOCUS}
-     * actions.
-     *
-     * @param virtualViewId The virtual view identifier of the item on which
-     *            to perform the action
-     * @param action The accessibility action to perform
-     * @param arguments (Optional) A bundle with additional arguments, or
-     *            null
-     * @return true if the action was performed
-     */
-    protected abstract boolean onPerformActionForVirtualView(
-            int virtualViewId, int action, Bundle arguments);
-
-    /**
-     * Exposes a virtual view hierarchy to the accessibility framework. Only
-     * used in API 16+.
-     */
-    private class ExploreByTouchNodeProvider extends AccessibilityNodeProvider {
-        @Override
-        public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
-            return ExploreByTouchHelper.this.createNode(virtualViewId);
-        }
-
-        @Override
-        public boolean performAction(int virtualViewId, int action, Bundle arguments) {
-            return ExploreByTouchHelper.this.performAction(virtualViewId, action, arguments);
-        }
-    }
-}