summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/AssistStructure.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/AssistStructure.java')
-rw-r--r--core/java/android/app/AssistStructure.java444
1 files changed, 243 insertions, 201 deletions
diff --git a/core/java/android/app/AssistStructure.java b/core/java/android/app/AssistStructure.java
index c435ccb..e31c821 100644
--- a/core/java/android/app/AssistStructure.java
+++ b/core/java/android/app/AssistStructure.java
@@ -17,7 +17,6 @@
package android.app;
import android.content.ComponentName;
-import android.content.res.Resources;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
@@ -31,10 +30,8 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewAssistStructure;
-import android.view.ViewGroup;
import android.view.ViewRootImpl;
import android.view.WindowManagerGlobal;
-import android.widget.Checkable;
import java.util.ArrayList;
@@ -56,107 +53,22 @@ final public class AssistStructure implements Parcelable {
final ArrayList<WindowNode> mWindowNodes = new ArrayList<>();
- ViewAssistStructureImpl mTmpViewAssistStructureImpl = new ViewAssistStructureImpl();
- Bundle mTmpExtras = new Bundle();
+ Rect mTmpRect = new Rect();
- final static class ViewAssistStructureImpl extends ViewAssistStructure {
+ final static class ViewNodeText {
CharSequence mText;
- int mTextSelectionStart = -1;
- int mTextSelectionEnd = -1;
- int mTextColor = ViewNode.TEXT_COLOR_UNDEFINED;
- int mTextBackgroundColor = ViewNode.TEXT_COLOR_UNDEFINED;
- float mTextSize = 0;
- int mTextStyle = 0;
- CharSequence mHint;
-
- @Override
- public void setText(CharSequence text) {
- mText = text;
- mTextSelectionStart = mTextSelectionEnd = -1;
- }
-
- @Override
- public void setText(CharSequence text, int selectionStart, int selectionEnd) {
- mText = text;
- mTextSelectionStart = selectionStart;
- mTextSelectionEnd = selectionEnd;
- }
-
- @Override
- public void setTextPaint(TextPaint paint) {
- mTextColor = paint.getColor();
- mTextBackgroundColor = paint.bgColor;
- mTextSize = paint.getTextSize();
- mTextStyle = 0;
- Typeface tf = paint.getTypeface();
- if (tf != null) {
- if (tf.isBold()) {
- mTextStyle |= ViewNode.TEXT_STYLE_BOLD;
- }
- if (tf.isItalic()) {
- mTextStyle |= ViewNode.TEXT_STYLE_ITALIC;
- }
- }
- int pflags = paint.getFlags();
- if ((pflags& Paint.FAKE_BOLD_TEXT_FLAG) != 0) {
- mTextStyle |= ViewNode.TEXT_STYLE_BOLD;
- }
- if ((pflags& Paint.UNDERLINE_TEXT_FLAG) != 0) {
- mTextStyle |= ViewNode.TEXT_STYLE_UNDERLINE;
- }
- if ((pflags& Paint.STRIKE_THRU_TEXT_FLAG) != 0) {
- mTextStyle |= ViewNode.TEXT_STYLE_STRIKE_THRU;
- }
- }
-
- @Override
- public void setHint(CharSequence hint) {
- mHint = hint;
- }
-
- @Override
- public CharSequence getText() {
- return mText;
- }
-
- @Override
- public int getTextSelectionStart() {
- return mTextSelectionStart;
- }
-
- @Override
- public int getTextSelectionEnd() {
- return mTextSelectionEnd;
- }
-
- @Override
- public CharSequence getHint() {
- return mHint;
- }
- }
-
- final static class ViewNodeTextImpl {
- final CharSequence mText;
- final int mTextSelectionStart;
- final int mTextSelectionEnd;
+ int mTextSelectionStart;
+ int mTextSelectionEnd;
int mTextColor;
int mTextBackgroundColor;
float mTextSize;
int mTextStyle;
- final String mHint;
+ String mHint;
- ViewNodeTextImpl(ViewAssistStructureImpl data) {
- mText = data.mText;
- mTextSelectionStart = data.mTextSelectionStart;
- mTextSelectionEnd = data.mTextSelectionEnd;
- mTextColor = data.mTextColor;
- mTextBackgroundColor = data.mTextBackgroundColor;
- mTextSize = data.mTextSize;
- mTextStyle = data.mTextStyle;
- mHint = data.mHint != null ? data.mHint.toString() : null;
+ ViewNodeText() {
}
- ViewNodeTextImpl(Parcel in) {
+ ViewNodeText(Parcel in) {
mText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mTextSelectionStart = in.readInt();
mTextSelectionEnd = in.readInt();
@@ -199,7 +111,9 @@ final public class AssistStructure implements Parcelable {
mWidth = rect.width();
mHeight = rect.height();
mTitle = root.getTitle();
- mRoot = new ViewNode(assist, view);
+ mRoot = new ViewNode();
+ ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot);
+ view.dispatchProvideAssistStructure(builder);
}
WindowNode(Parcel in, PooledStringReader preader) {
@@ -260,16 +174,16 @@ final public class AssistStructure implements Parcelable {
public static final int TEXT_STYLE_UNDERLINE = 1<<2;
public static final int TEXT_STYLE_STRIKE_THRU = 1<<3;
- final int mId;
- final String mIdPackage;
- final String mIdType;
- final String mIdEntry;
- final int mX;
- final int mY;
- final int mScrollX;
- final int mScrollY;
- final int mWidth;
- final int mHeight;
+ int mId;
+ String mIdPackage;
+ String mIdType;
+ String mIdEntry;
+ int mX;
+ int mY;
+ int mScrollX;
+ int mScrollY;
+ int mWidth;
+ int mHeight;
static final int FLAGS_DISABLED = 0x00000001;
static final int FLAGS_VISIBILITY_MASK = View.VISIBLE|View.INVISIBLE|View.GONE;
@@ -283,104 +197,17 @@ final public class AssistStructure implements Parcelable {
static final int FLAGS_CLICKABLE = 0x00004000;
static final int FLAGS_LONG_CLICKABLE = 0x00200000;
- final int mFlags;
+ int mFlags;
- final String mClassName;
- final CharSequence mContentDescription;
+ String mClassName;
+ CharSequence mContentDescription;
- final ViewNodeTextImpl mText;
- final Bundle mExtras;
+ ViewNodeText mText;
+ Bundle mExtras;
- final ViewNode[] mChildren;
+ ViewNode[] mChildren;
- ViewNode(AssistStructure assistStructure, View view) {
- mId = view.getId();
- if (mId > 0 && (mId&0xff000000) != 0 && (mId&0x00ff0000) != 0
- && (mId&0x0000ffff) != 0) {
- String pkg, type, entry;
- try {
- Resources res = view.getResources();
- entry = res.getResourceEntryName(mId);
- type = res.getResourceTypeName(mId);
- pkg = res.getResourcePackageName(mId);
- } catch (Resources.NotFoundException e) {
- entry = type = pkg = null;
- }
- mIdPackage = pkg;
- mIdType = type;
- mIdEntry = entry;
- } else {
- mIdPackage = mIdType = mIdEntry = null;
- }
- mX = view.getLeft();
- mY = view.getTop();
- mScrollX = view.getScrollX();
- mScrollY = view.getScrollY();
- mWidth = view.getWidth();
- mHeight = view.getHeight();
- int flags = view.getVisibility();
- if (!view.isEnabled()) {
- flags |= FLAGS_DISABLED;
- }
- if (!view.isClickable()) {
- flags |= FLAGS_CLICKABLE;
- }
- if (!view.isFocusable()) {
- flags |= FLAGS_FOCUSABLE;
- }
- if (!view.isFocused()) {
- flags |= FLAGS_FOCUSED;
- }
- if (!view.isAccessibilityFocused()) {
- flags |= FLAGS_ACCESSIBILITY_FOCUSED;
- }
- if (!view.isSelected()) {
- flags |= FLAGS_SELECTED;
- }
- if (!view.isActivated()) {
- flags |= FLAGS_ACTIVATED;
- }
- if (!view.isLongClickable()) {
- flags |= FLAGS_LONG_CLICKABLE;
- }
- if (view instanceof Checkable) {
- flags |= FLAGS_CHECKABLE;
- if (((Checkable)view).isChecked()) {
- flags |= FLAGS_CHECKED;
- }
- }
- mFlags = flags;
- mClassName = view.getAccessibilityClassName().toString();
- mContentDescription = view.getContentDescription();
- final ViewAssistStructureImpl viewData = assistStructure.mTmpViewAssistStructureImpl;
- final Bundle extras = assistStructure.mTmpExtras;
- view.onProvideAssistStructure(viewData, extras);
- if (viewData.mText != null || viewData.mHint != null) {
- mText = new ViewNodeTextImpl(viewData);
- assistStructure.mTmpViewAssistStructureImpl = new ViewAssistStructureImpl();
- } else {
- mText = null;
- }
- if (!extras.isEmpty()) {
- mExtras = extras;
- assistStructure.mTmpExtras = new Bundle();
- } else {
- mExtras = null;
- }
- if (view instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup)view;
- final int NCHILDREN = vg.getChildCount();
- if (NCHILDREN > 0) {
- mChildren = new ViewNode[NCHILDREN];
- for (int i=0; i<NCHILDREN; i++) {
- mChildren[i] = new ViewNode(assistStructure, vg.getChildAt(i));
- }
- } else {
- mChildren = null;
- }
- } else {
- mChildren = null;
- }
+ ViewNode() {
}
ViewNode(Parcel in, PooledStringReader preader) {
@@ -406,7 +233,7 @@ final public class AssistStructure implements Parcelable {
mClassName = preader.readString();
mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
if (in.readInt() != 0) {
- mText = new ViewNodeTextImpl(in);
+ mText = new ViewNodeText(in);
} else {
mText = null;
}
@@ -595,6 +422,221 @@ final public class AssistStructure implements Parcelable {
}
}
+ static class ViewNodeBuilder extends ViewAssistStructure {
+ final AssistStructure mAssist;
+ final ViewNode mNode;
+
+ ViewNodeBuilder(AssistStructure assist, ViewNode node) {
+ mAssist = assist;
+ mNode = node;
+ }
+
+ @Override
+ public void setId(int id, String packageName, String typeName, String entryName) {
+ mNode.mId = id;
+ mNode.mIdPackage = packageName;
+ mNode.mIdType = typeName;
+ mNode.mIdEntry = entryName;
+ }
+
+ @Override
+ public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
+ mNode.mX = left;
+ mNode.mY = top;
+ mNode.mScrollX = scrollX;
+ mNode.mScrollY = scrollY;
+ mNode.mWidth = width;
+ mNode.mHeight = height;
+ }
+
+ @Override
+ public void setVisibility(int visibility) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_VISIBILITY_MASK) | visibility;
+ }
+
+ @Override
+ public void setEnabled(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_DISABLED)
+ | (state ? 0 : ViewNode.FLAGS_DISABLED);
+ }
+
+ @Override
+ public void setClickable(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_CLICKABLE)
+ | (state ? ViewNode.FLAGS_CLICKABLE : 0);
+ }
+
+ @Override
+ public void setLongClickable(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_LONG_CLICKABLE)
+ | (state ? ViewNode.FLAGS_LONG_CLICKABLE : 0);
+ }
+
+ @Override
+ public void setFocusable(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_FOCUSABLE)
+ | (state ? ViewNode.FLAGS_FOCUSABLE : 0);
+ }
+
+ @Override
+ public void setFocused(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_FOCUSED)
+ | (state ? ViewNode.FLAGS_FOCUSED : 0);
+ }
+
+ @Override
+ public void setAccessibilityFocused(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_ACCESSIBILITY_FOCUSED)
+ | (state ? ViewNode.FLAGS_ACCESSIBILITY_FOCUSED : 0);
+ }
+
+ @Override
+ public void setCheckable(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_CHECKABLE)
+ | (state ? ViewNode.FLAGS_CHECKABLE : 0);
+ }
+
+ @Override
+ public void setChecked(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_CHECKED)
+ | (state ? ViewNode.FLAGS_CHECKED : 0);
+ }
+
+ @Override
+ public void setSelected(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_SELECTED)
+ | (state ? ViewNode.FLAGS_SELECTED : 0);
+ }
+
+ @Override
+ public void setActivated(boolean state) {
+ mNode.mFlags = (mNode.mFlags&~ViewNode.FLAGS_ACTIVATED)
+ | (state ? ViewNode.FLAGS_ACTIVATED : 0);
+ }
+
+ @Override
+ public void setClassName(String className) {
+ mNode.mClassName = className;
+ }
+
+ @Override
+ public void setContentDescription(CharSequence contentDescription) {
+ mNode.mContentDescription = contentDescription;
+ }
+
+ private final ViewNodeText getNodeText() {
+ if (mNode.mText != null) {
+ return mNode.mText;
+ }
+ mNode.mText = new ViewNodeText();
+ return mNode.mText;
+ }
+
+ @Override
+ public void setText(CharSequence text) {
+ ViewNodeText t = getNodeText();
+ t.mText = text;
+ t.mTextSelectionStart = t.mTextSelectionEnd = -1;
+ }
+
+ @Override
+ public void setText(CharSequence text, int selectionStart, int selectionEnd) {
+ ViewNodeText t = getNodeText();
+ t.mText = text;
+ t.mTextSelectionStart = selectionStart;
+ t.mTextSelectionEnd = selectionEnd;
+ }
+
+ @Override
+ public void setTextPaint(TextPaint paint) {
+ ViewNodeText t = getNodeText();
+ t.mTextColor = paint.getColor();
+ t.mTextBackgroundColor = paint.bgColor;
+ t.mTextSize = paint.getTextSize();
+ t.mTextStyle = 0;
+ Typeface tf = paint.getTypeface();
+ if (tf != null) {
+ if (tf.isBold()) {
+ t.mTextStyle |= ViewNode.TEXT_STYLE_BOLD;
+ }
+ if (tf.isItalic()) {
+ t.mTextStyle |= ViewNode.TEXT_STYLE_ITALIC;
+ }
+ }
+ int pflags = paint.getFlags();
+ if ((pflags& Paint.FAKE_BOLD_TEXT_FLAG) != 0) {
+ t.mTextStyle |= ViewNode.TEXT_STYLE_BOLD;
+ }
+ if ((pflags& Paint.UNDERLINE_TEXT_FLAG) != 0) {
+ t.mTextStyle |= ViewNode.TEXT_STYLE_UNDERLINE;
+ }
+ if ((pflags& Paint.STRIKE_THRU_TEXT_FLAG) != 0) {
+ t.mTextStyle |= ViewNode.TEXT_STYLE_STRIKE_THRU;
+ }
+ }
+
+ @Override
+ public void setHint(CharSequence hint) {
+ getNodeText().mHint = hint != null ? hint.toString() : null;
+ }
+
+ @Override
+ public CharSequence getText() {
+ return mNode.mText != null ? mNode.mText.mText : null;
+ }
+
+ @Override
+ public int getTextSelectionStart() {
+ return mNode.mText != null ? mNode.mText.mTextSelectionStart : -1;
+ }
+
+ @Override
+ public int getTextSelectionEnd() {
+ return mNode.mText != null ? mNode.mText.mTextSelectionEnd : -1;
+ }
+
+ @Override
+ public CharSequence getHint() {
+ return mNode.mText != null ? mNode.mText.mHint : null;
+ }
+
+ @Override
+ public Bundle editExtras() {
+ if (mNode.mExtras != null) {
+ return mNode.mExtras;
+ }
+ mNode.mExtras = new Bundle();
+ return mNode.mExtras;
+ }
+
+ @Override
+ public void clearExtras() {
+ mNode.mExtras = null;
+ }
+
+ @Override
+ public void setChildCount(int num) {
+ mNode.mChildren = new ViewNode[num];
+ }
+
+ @Override
+ public int getChildCount() {
+ return mNode.mChildren != null ? mNode.mChildren.length : 0;
+ }
+
+ @Override
+ public ViewAssistStructure newChild(int index) {
+ ViewNode node = new ViewNode();
+ mNode.mChildren[index] = node;
+ return new ViewNodeBuilder(mAssist, node);
+ }
+
+ @Override
+ public Rect getTempRect() {
+ return mAssist.mTmpRect;
+ }
+ }
+
AssistStructure(Activity activity) {
mActivityComponent = activity.getComponentName();
ArrayList<ViewRootImpl> views = WindowManagerGlobal.getInstance().getRootViews(