summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Maxim Bogatov <maximbogatov@google.com> 2015-06-23 19:26:56 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-06-23 19:26:58 +0000
commite5a4a91c0129222ac9900a76906f951df5b0ffae (patch)
treec467951fad0e28cf0ce4ba6a709f164ec893f528
parent3ee0c635698d36f660ebb6dd139192f36a22c0dc (diff)
parent2f55a3f0b887ec8966d4cf1858b72612fcf358c2 (diff)
Merge "Transfer a11y node with a11y event" into mnc-dev
-rw-r--r--core/java/android/view/View.java10
-rw-r--r--core/java/android/view/accessibility/AccessibilityEvent.java11
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java4
-rw-r--r--core/java/android/view/accessibility/AccessibilityRecord.java57
4 files changed, 57 insertions, 25 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index fd3ee4f84654..92dae2efcd71 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6032,7 +6032,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
if (provider != null) {
- return provider.createAccessibilityNodeInfo(View.NO_ID);
+ return provider.createAccessibilityNodeInfo(AccessibilityNodeProvider.HOST_VIEW_ID);
} else {
AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(this);
onInitializeAccessibilityNodeInfo(info);
@@ -6326,6 +6326,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ if (mAttachInfo == null) {
+ return;
+ }
+
Rect bounds = mAttachInfo.mTmpInvalRect;
getDrawingRect(bounds);
@@ -8774,7 +8778,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
public void notifyViewAccessibilityStateChangedIfNeeded(int changeType) {
- if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
+ if (!AccessibilityManager.getInstance(mContext).isEnabled() || mAttachInfo == null) {
return;
}
if (mSendViewStateChangedAccessibilityEvent == null) {
@@ -8796,7 +8800,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @hide
*/
public void notifySubtreeAccessibilityStateChangedIfNeeded() {
- if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
+ if (!AccessibilityManager.getInstance(mContext).isEnabled() || mAttachInfo == null) {
return;
}
if ((mPrivateFlags2 & PFLAG2_SUBTREE_ACCESSIBILITY_STATE_CHANGED) == 0) {
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index ab793e038675..87706ef64a55 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -1115,7 +1115,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
record.mParcelableData = parcel.readParcelable(null);
parcel.readList(record.mText, null);
record.mSourceWindowId = parcel.readInt();
- record.mSourceNodeId = parcel.readLong();
+ record.mSourceNode = parcel.readParcelable(null);
record.mSealed = (parcel.readInt() == 1);
}
@@ -1167,7 +1167,10 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
parcel.writeParcelable(record.mParcelableData, flags);
parcel.writeList(record.mText);
parcel.writeInt(record.mSourceWindowId);
- parcel.writeLong(record.mSourceNodeId);
+ // create copy of the node here because the node would be recycled just after it is written
+ // to parcel
+ parcel.writeParcelable(record.mSourceNode != null ?
+ AccessibilityNodeInfo.obtain(record.mSourceNode) : null, flags);
parcel.writeInt(record.mSealed ? 1 : 0);
}
@@ -1191,7 +1194,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
builder.append("\n");
builder.append("; ContentChangeTypes: ").append(mContentChangeTypes);
builder.append("; sourceWindowId: ").append(mSourceWindowId);
- builder.append("; mSourceNodeId: ").append(mSourceNodeId);
+ if (mSourceNode != null) {
+ builder.append("; mSourceNodeId: ").append(mSourceNode.getSourceNodeId());
+ }
for (int i = 0; i < getRecordCount(); i++) {
final AccessibilityRecord record = getRecord(i);
builder.append(" Record ");
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 36de8f3689bf..86ed499cabc0 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -2821,7 +2821,7 @@ public class AccessibilityNodeInfo implements Parcelable {
* @param parcel A parcel containing the state of a {@link AccessibilityNodeInfo}.
*/
private void initFromParcel(Parcel parcel) {
- mSealed = (parcel.readInt() == 1);
+ final boolean sealed = (parcel.readInt() == 1);
mSourceNodeId = parcel.readLong();
mWindowId = parcel.readInt();
mParentNodeId = parcel.readLong();
@@ -2911,6 +2911,8 @@ public class AccessibilityNodeInfo implements Parcelable {
parcel.readInt() == 1,
parcel.readInt() == 1);
}
+
+ mSealed = sealed;
}
/**
diff --git a/core/java/android/view/accessibility/AccessibilityRecord.java b/core/java/android/view/accessibility/AccessibilityRecord.java
index cc6a71d1250b..f99690adcffa 100644
--- a/core/java/android/view/accessibility/AccessibilityRecord.java
+++ b/core/java/android/view/accessibility/AccessibilityRecord.java
@@ -90,7 +90,7 @@ public class AccessibilityRecord {
int mAddedCount= UNDEFINED;
int mRemovedCount = UNDEFINED;
- long mSourceNodeId = AccessibilityNodeInfo.makeNodeId(UNDEFINED, UNDEFINED);
+ AccessibilityNodeInfo mSourceNode;
int mSourceWindowId = UNDEFINED;
CharSequence mClassName;
@@ -135,16 +135,24 @@ public class AccessibilityRecord {
*/
public void setSource(View root, int virtualDescendantId) {
enforceNotSealed();
- final boolean important;
- if (virtualDescendantId == UNDEFINED) {
- important = (root != null) ? root.isImportantForAccessibility() : true;
- } else {
- important = true;
+ boolean important = true;
+ mSourceWindowId = UNDEFINED;
+ clearSourceNode();
+ if (root != null) {
+ if (virtualDescendantId == UNDEFINED ||
+ virtualDescendantId == AccessibilityNodeInfo.UNDEFINED_ITEM_ID) {
+ important = root.isImportantForAccessibility();
+ mSourceNode = root.createAccessibilityNodeInfo();
+ } else {
+ AccessibilityNodeProvider provider = root.getAccessibilityNodeProvider();
+ if (provider != null) {
+ mSourceNode = provider.createAccessibilityNodeInfo(virtualDescendantId);
+ }
+ }
+
+ mSourceWindowId = root.getAccessibilityWindowId();
}
setBooleanProperty(PROPERTY_IMPORTANT_FOR_ACCESSIBILITY, important);
- mSourceWindowId = (root != null) ? root.getAccessibilityWindowId() : UNDEFINED;
- final int rootViewId = (root != null) ? root.getAccessibilityViewId() : UNDEFINED;
- mSourceNodeId = AccessibilityNodeInfo.makeNodeId(rootViewId, virtualDescendantId);
}
/**
@@ -158,13 +166,11 @@ public class AccessibilityRecord {
*/
public AccessibilityNodeInfo getSource() {
enforceSealed();
- if (mConnectionId == UNDEFINED || mSourceWindowId == UNDEFINED
- || AccessibilityNodeInfo.getAccessibilityViewId(mSourceNodeId) == UNDEFINED) {
- return null;
+ if (mSourceNode != null) {
+ return AccessibilityNodeInfo.obtain(mSourceNode);
}
- AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance();
- return client.findAccessibilityNodeInfoByAccessibilityId(mConnectionId, mSourceWindowId,
- mSourceNodeId, false, GET_SOURCE_PREFETCH_FLAGS);
+
+ return null;
}
/**
@@ -619,7 +625,7 @@ public class AccessibilityRecord {
* @hide
*/
public long getSourceNodeId() {
- return mSourceNodeId;
+ return mSourceNode != null ? mSourceNode.getSourceNodeId() : UNDEFINED;
}
/**
@@ -633,6 +639,9 @@ public class AccessibilityRecord {
public void setConnectionId(int connectionId) {
enforceNotSealed();
mConnectionId = connectionId;
+ if (mSourceNode != null) {
+ mSourceNode.setConnectionId(mConnectionId);
+ }
}
/**
@@ -644,6 +653,9 @@ public class AccessibilityRecord {
*/
public void setSealed(boolean sealed) {
mSealed = sealed;
+ if (mSourceNode != null) {
+ mSourceNode.setSealed(sealed);
+ }
}
/**
@@ -782,7 +794,9 @@ public class AccessibilityRecord {
mParcelableData = record.mParcelableData;
mText.addAll(record.mText);
mSourceWindowId = record.mSourceWindowId;
- mSourceNodeId = record.mSourceNodeId;
+ if (record.mSourceNode != null) {
+ mSourceNode = AccessibilityNodeInfo.obtain(record.mSourceNode);
+ }
mConnectionId = record.mConnectionId;
}
@@ -807,11 +821,18 @@ public class AccessibilityRecord {
mBeforeText = null;
mParcelableData = null;
mText.clear();
- mSourceNodeId = AccessibilityNodeInfo.makeNodeId(UNDEFINED, UNDEFINED);
+ clearSourceNode();
mSourceWindowId = UNDEFINED;
mConnectionId = UNDEFINED;
}
+ private void clearSourceNode() {
+ if (mSourceNode != null) {
+ mSourceNode.recycle();
+ mSourceNode = null;
+ }
+ }
+
@Override
public String toString() {
StringBuilder builder = new StringBuilder();