summaryrefslogtreecommitdiffstats
path: root/core/java/android/view/View.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/view/View.java')
-rw-r--r--core/java/android/view/View.java140
1 files changed, 137 insertions, 3 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a69384a..c0e253b 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -91,6 +91,7 @@ import android.view.animation.Transformation;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
+import android.widget.Checkable;
import android.widget.ScrollBarDrawable;
import static android.os.Build.VERSION_CODES.*;
@@ -5676,10 +5677,143 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Called when assist structure is being retrieved from a view as part of
* {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData}.
- * @param structure Additional standard structured view structure to supply.
- * @param extras Non-standard extensions.
+ * @param structure Fill in with structured view data. The default implementation
+ * fills in all data that can be inferred from the view itself.
+ */
+ public void onProvideAssistStructure(ViewAssistStructure structure) {
+ final int id = mID;
+ if (id > 0 && (id&0xff000000) != 0 && (id&0x00ff0000) != 0
+ && (id&0x0000ffff) != 0) {
+ String pkg, type, entry;
+ try {
+ final Resources res = getResources();
+ entry = res.getResourceEntryName(id);
+ type = res.getResourceTypeName(id);
+ pkg = res.getResourcePackageName(id);
+ } catch (Resources.NotFoundException e) {
+ entry = type = pkg = null;
+ }
+ structure.setId(id, pkg, type, entry);
+ } else {
+ structure.setId(id, null, null, null);
+ }
+ structure.setDimens(mLeft, mTop, mScrollX, mScrollY, mRight-mLeft, mBottom-mTop);
+ structure.setVisibility(getVisibility());
+ structure.setEnabled(isEnabled());
+ if (isClickable()) {
+ structure.setClickable(true);
+ }
+ if (isFocusable()) {
+ structure.setFocusable(true);
+ }
+ if (isFocused()) {
+ structure.setFocused(true);
+ }
+ if (isAccessibilityFocused()) {
+ structure.setAccessibilityFocused(true);
+ }
+ if (isSelected()) {
+ structure.setSelected(true);
+ }
+ if (isActivated()) {
+ structure.setActivated(true);
+ }
+ if (isLongClickable()) {
+ structure.setLongClickable(true);
+ }
+ if (this instanceof Checkable) {
+ structure.setCheckable(true);
+ if (((Checkable)this).isChecked()) {
+ structure.setChecked(true);
+ }
+ }
+ structure.setClassName(getAccessibilityClassName().toString());
+ structure.setContentDescription(getContentDescription());
+ }
+
+ /**
+ * Called when assist structure is being retrieved from a view as part of
+ * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData} to
+ * generate additional virtual structure under this view. The defaullt implementation
+ * uses {@link #getAccessibilityNodeProvider()} to try to generate this from the
+ * view's virtual accessibility nodes, if any. You can override this for a more
+ * optimal implementation providing this data.
+ */
+ public void onProvideVirtualAssistStructure(ViewAssistStructure structure) {
+ AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
+ if (provider != null) {
+ AccessibilityNodeInfo info = createAccessibilityNodeInfo();
+ Log.i("View", "Provider of " + this + ": children=" + info.getChildCount());
+ structure.setChildCount(1);
+ ViewAssistStructure root = structure.newChild(0);
+ populateVirtualAssistStructure(root, provider, info);
+ info.recycle();
+ }
+ }
+
+ private void populateVirtualAssistStructure(ViewAssistStructure structure,
+ AccessibilityNodeProvider provider, AccessibilityNodeInfo info) {
+ structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()),
+ null, null, null);
+ Rect rect = structure.getTempRect();
+ info.getBoundsInParent(rect);
+ structure.setDimens(rect.left, rect.top, 0, 0, rect.width(), rect.height());
+ structure.setVisibility(VISIBLE);
+ structure.setEnabled(info.isEnabled());
+ if (info.isClickable()) {
+ structure.setClickable(true);
+ }
+ if (info.isFocusable()) {
+ structure.setFocusable(true);
+ }
+ if (info.isFocused()) {
+ structure.setFocused(true);
+ }
+ if (info.isAccessibilityFocused()) {
+ structure.setAccessibilityFocused(true);
+ }
+ if (info.isSelected()) {
+ structure.setSelected(true);
+ }
+ if (info.isLongClickable()) {
+ structure.setLongClickable(true);
+ }
+ if (info.isCheckable()) {
+ structure.setCheckable(true);
+ if (info.isChecked()) {
+ structure.setChecked(true);
+ }
+ }
+ CharSequence cname = info.getClassName();
+ structure.setClassName(cname != null ? cname.toString() : null);
+ structure.setContentDescription(info.getContentDescription());
+ Log.i("View", "vassist " + cname + " @ " + rect.toShortString()
+ + " text=" + info.getText() + " cd=" + info.getContentDescription());
+ if (info.getText() != null || info.getError() != null) {
+ structure.setText(info.getText(), info.getTextSelectionStart(),
+ info.getTextSelectionEnd());
+ }
+ final int NCHILDREN = info.getChildCount();
+ if (NCHILDREN > 0) {
+ structure.setChildCount(NCHILDREN);
+ for (int i=0; i<NCHILDREN; i++) {
+ AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo(
+ AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i)));
+ ViewAssistStructure child = structure.newChild(i);
+ populateVirtualAssistStructure(child, provider, cinfo);
+ cinfo.recycle();
+ }
+ }
+ }
+
+ /**
+ * Dispatch creation of {@link ViewAssistStructure} down the hierarchy. The default
+ * implementation calls {@link #onProvideAssistStructure} and
+ * {@link #onProvideVirtualAssistStructure}.
*/
- public void onProvideAssistStructure(ViewAssistStructure structure, Bundle extras) {
+ public void dispatchProvideAssistStructure(ViewAssistStructure structure) {
+ onProvideAssistStructure(structure);
+ onProvideVirtualAssistStructure(structure);
}
/**