summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt4
-rw-r--r--core/api/test-current.txt1
-rw-r--r--core/java/android/view/ViewConfiguration.java1
-rw-r--r--core/java/android/view/accessibility/AccessibilityNodeInfo.java63
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java2
5 files changed, 70 insertions, 1 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 1cb2d602354b..2b965cf2a13e 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -52372,6 +52372,7 @@ package android.view.accessibility {
method public android.view.accessibility.AccessibilityNodeInfo getLabeledBy();
method public int getLiveRegion();
method public int getMaxTextLength();
+ method public int getMinMillisBetweenContentChanges();
method public int getMovementGranularities();
method public CharSequence getPackageName();
method @Nullable public CharSequence getPaneTitle();
@@ -52459,6 +52460,7 @@ package android.view.accessibility {
method public void setLiveRegion(int);
method public void setLongClickable(boolean);
method public void setMaxTextLength(int);
+ method public void setMinMillisBetweenContentChanges(int);
method public void setMovementGranularities(int);
method public void setMultiLine(boolean);
method public void setPackageName(CharSequence);
@@ -52538,11 +52540,13 @@ package android.view.accessibility {
field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
field public static final int FOCUS_INPUT = 1; // 0x1
field public static final int MAX_NUMBER_OF_PREFETCHED_NODES = 50; // 0x32
+ field public static final int MINIMUM_MIN_MILLIS_BETWEEN_CONTENT_CHANGES = 100; // 0x64
field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ field public static final int UNDEFINED_MIN_MILLIS_BETWEEN_CONTENT_CHANGES = -1; // 0xffffffff
}
public static final class AccessibilityNodeInfo.AccessibilityAction implements android.os.Parcelable {
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index ae5a5ee88d98..d8419a87edc2 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2945,6 +2945,7 @@ package android.view {
method public static int getHoverTooltipHideTimeout();
method public static int getHoverTooltipShowTimeout();
method public static int getLongPressTooltipHideTimeout();
+ method public static long getSendRecurringAccessibilityEventsInterval();
method public boolean isPreferKeepClearForFocusEnabled();
}
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index f51d9bacc0a5..58aee61b98be 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -822,6 +822,7 @@ public class ViewConfiguration {
*
* @hide
*/
+ @TestApi
public static long getSendRecurringAccessibilityEventsInterval() {
return SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS;
}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 9dbababb4de8..88adb2e1b1f1 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -127,6 +127,16 @@ public class AccessibilityNodeInfo implements Parcelable {
/** @hide */
public static final long UNDEFINED_NODE_ID = makeNodeId(UNDEFINED_ITEM_ID, UNDEFINED_ITEM_ID);
+ /**
+ * The default value for {@link #getMinMillisBetweenContentChanges};
+ */
+ public static final int UNDEFINED_MIN_MILLIS_BETWEEN_CONTENT_CHANGES = -1;
+
+ /**
+ * The minimum value for {@link #setMinMillisBetweenContentChanges};
+ */
+ public static final int MINIMUM_MIN_MILLIS_BETWEEN_CONTENT_CHANGES = 100;
+
/** @hide */
public static final long ROOT_NODE_ID = makeNodeId(ROOT_ITEM_ID,
AccessibilityNodeProvider.HOST_VIEW_ID);
@@ -879,6 +889,9 @@ public class AccessibilityNodeInfo implements Parcelable {
private long mTraversalBefore = UNDEFINED_NODE_ID;
private long mTraversalAfter = UNDEFINED_NODE_ID;
+ private int mMinMillisBetweenContentChanges =
+ UNDEFINED_MIN_MILLIS_BETWEEN_CONTENT_CHANGES;
+
private int mBooleanProperties;
private final Rect mBoundsInParent = new Rect();
private final Rect mBoundsInScreen = new Rect();
@@ -1782,6 +1795,42 @@ public class AccessibilityNodeInfo implements Parcelable {
}
/**
+ * Sets the minimum time duration between two content change events, which is used in throttling
+ * content change events in accessibility services.
+ *
+ * <p>
+ * <strong>Note:</strong>
+ * This value should not be smaller than {@link #MINIMUM_MIN_MILLIS_BETWEEN_CONTENT_CHANGES},
+ * otherwise it would be ignored by accessibility services.
+ * </p>
+ *
+ * <p>
+ * Example: An app can set MinMillisBetweenContentChanges as 1 min for a view which sends
+ * content change events to accessibility services one event per second.
+ * Accessibility service will throttle those content change events and only handle one event
+ * per minute for that view.
+ * </p>
+ *
+ * @see AccessibilityEvent#getContentChangeTypes for all content change types.
+ * @param minMillisBetweenContentChanges the minimum duration between content change events.
+ */
+ public void setMinMillisBetweenContentChanges(int minMillisBetweenContentChanges) {
+ enforceNotSealed();
+ mMinMillisBetweenContentChanges = minMillisBetweenContentChanges
+ >= MINIMUM_MIN_MILLIS_BETWEEN_CONTENT_CHANGES
+ ? minMillisBetweenContentChanges
+ : UNDEFINED_MIN_MILLIS_BETWEEN_CONTENT_CHANGES;
+ }
+
+ /**
+ * Gets the minimum time duration between two content change events. This method may return
+ * {@link #UNDEFINED_MIN_MILLIS_BETWEEN_CONTENT_CHANGES}
+ */
+ public int getMinMillisBetweenContentChanges() {
+ return mMinMillisBetweenContentChanges;
+ }
+
+ /**
* Performs an action on the node.
* <p>
* <strong>Note:</strong> An action can be performed only if the request is made
@@ -3951,6 +4000,11 @@ public class AccessibilityNodeInfo implements Parcelable {
fieldIndex++;
if (mTraversalAfter != DEFAULT.mTraversalAfter) nonDefaultFields |= bitAt(fieldIndex);
fieldIndex++;
+ if (mMinMillisBetweenContentChanges
+ != DEFAULT.mMinMillisBetweenContentChanges) {
+ nonDefaultFields |= bitAt(fieldIndex);
+ }
+ fieldIndex++;
if (mConnectionId != DEFAULT.mConnectionId) nonDefaultFields |= bitAt(fieldIndex);
fieldIndex++;
if (!LongArray.elementsEqual(mChildNodeIds, DEFAULT.mChildNodeIds)) {
@@ -4080,6 +4134,9 @@ public class AccessibilityNodeInfo implements Parcelable {
if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeLong(mLabeledById);
if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeLong(mTraversalBefore);
if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeLong(mTraversalAfter);
+ if (isBitSet(nonDefaultFields, fieldIndex++)) {
+ parcel.writeInt(mMinMillisBetweenContentChanges);
+ }
if (isBitSet(nonDefaultFields, fieldIndex++)) parcel.writeInt(mConnectionId);
@@ -4235,6 +4292,7 @@ public class AccessibilityNodeInfo implements Parcelable {
mLabeledById = other.mLabeledById;
mTraversalBefore = other.mTraversalBefore;
mTraversalAfter = other.mTraversalAfter;
+ mMinMillisBetweenContentChanges = other.mMinMillisBetweenContentChanges;
mWindowId = other.mWindowId;
mConnectionId = other.mConnectionId;
mUniqueId = other.mUniqueId;
@@ -4338,6 +4396,9 @@ public class AccessibilityNodeInfo implements Parcelable {
if (isBitSet(nonDefaultFields, fieldIndex++)) mLabeledById = parcel.readLong();
if (isBitSet(nonDefaultFields, fieldIndex++)) mTraversalBefore = parcel.readLong();
if (isBitSet(nonDefaultFields, fieldIndex++)) mTraversalAfter = parcel.readLong();
+ if (isBitSet(nonDefaultFields, fieldIndex++)) {
+ mMinMillisBetweenContentChanges = parcel.readInt();
+ }
if (isBitSet(nonDefaultFields, fieldIndex++)) mConnectionId = parcel.readInt();
@@ -4686,6 +4747,8 @@ public class AccessibilityNodeInfo implements Parcelable {
builder.append("; mParentNodeId: 0x").append(Long.toHexString(mParentNodeId));
builder.append("; traversalBefore: 0x").append(Long.toHexString(mTraversalBefore));
builder.append("; traversalAfter: 0x").append(Long.toHexString(mTraversalAfter));
+ builder.append("; minMillisBetweenContentChanges: ")
+ .append(mMinMillisBetweenContentChanges);
int granularities = mMovementGranularities;
builder.append("; MovementGranularities: [");
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 32085c1cfbeb..cc02bbb3e7d1 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -46,7 +46,7 @@ public class AccessibilityNodeInfoTest {
// The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
// See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
// and assertAccessibilityNodeInfoCleared in that class.
- private static final int NUM_MARSHALLED_PROPERTIES = 41;
+ private static final int NUM_MARSHALLED_PROPERTIES = 42;
/**
* The number of properties that are purposely not marshalled