summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Horvath <robhor@google.com> 2022-02-23 18:09:46 +0100
committer Robert Horvath <robhor@google.com> 2022-06-24 15:04:44 +0200
commitc48d9032baa83abbdf6c804e0cf4a6ebafdd9ae0 (patch)
tree35115c19a47771af7631800d33e6a3ca637b5ff1
parent5ccead10846ea567d5ac610410a63d2a8e4d257b (diff)
Mark accessibility focus bounds as keep clear area
Similar to how input focus can create an automatic keep clear area, this change makes the current accessibility focus rect a keep clear area. Bug: 220108592 Test: atest KeepClearRectsTests Change-Id: I26ca9bf81db31a34046f2453310c1a2f2d8823e8
-rw-r--r--core/java/android/view/ViewRootImpl.java32
1 files changed, 27 insertions, 5 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 2dbf42f93e62..f459bcaf48ce 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -802,6 +802,7 @@ public final class ViewRootImpl implements ViewParent,
private final ViewRootRectTracker mUnrestrictedKeepClearRectsTracker =
new ViewRootRectTracker(v -> v.collectUnrestrictedPreferKeepClearRects());
private boolean mHasPendingKeepClearAreaChange;
+ private Rect mKeepClearAccessibilityFocusRect;
private IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection;
@@ -4824,13 +4825,27 @@ public final class ViewRootImpl implements ViewParent,
mHandler.sendEmptyMessage(MSG_KEEP_CLEAR_RECTS_CHANGED);
}
- void keepClearRectsChanged() {
+ private void updateKeepClearForAccessibilityFocusRect() {
+ if (mViewConfiguration.isPreferKeepClearForFocusEnabled()) {
+ if (mKeepClearAccessibilityFocusRect == null) {
+ mKeepClearAccessibilityFocusRect = new Rect();
+ }
+ boolean hasAccessibilityFocus =
+ getAccessibilityFocusedRect(mKeepClearAccessibilityFocusRect);
+ if (!hasAccessibilityFocus) {
+ mKeepClearAccessibilityFocusRect.setEmpty();
+ }
+ mHandler.obtainMessage(MSG_KEEP_CLEAR_RECTS_CHANGED, 1, 0).sendToTarget();
+ }
+ }
+
+ void keepClearRectsChanged(boolean accessibilityFocusRectChanged) {
boolean restrictedKeepClearRectsChanged = mKeepClearRectsTracker.computeChanges();
boolean unrestrictedKeepClearRectsChanged =
mUnrestrictedKeepClearRectsTracker.computeChanges();
- if ((restrictedKeepClearRectsChanged || unrestrictedKeepClearRectsChanged)
- && mView != null) {
+ if ((restrictedKeepClearRectsChanged || unrestrictedKeepClearRectsChanged
+ || accessibilityFocusRectChanged) && mView != null) {
mHasPendingKeepClearAreaChange = true;
// Only report keep clear areas immediately if they have not been reported recently
if (!mHandler.hasMessages(MSG_REPORT_KEEP_CLEAR_RECTS)) {
@@ -4847,10 +4862,16 @@ public final class ViewRootImpl implements ViewParent,
}
mHasPendingKeepClearAreaChange = false;
- final List<Rect> restrictedKeepClearRects = mKeepClearRectsTracker.getLastComputedRects();
+ List<Rect> restrictedKeepClearRects = mKeepClearRectsTracker.getLastComputedRects();
final List<Rect> unrestrictedKeepClearRects =
mUnrestrictedKeepClearRectsTracker.getLastComputedRects();
+ if (mKeepClearAccessibilityFocusRect != null
+ && !mKeepClearAccessibilityFocusRect.isEmpty()) {
+ restrictedKeepClearRects = new ArrayList<>(restrictedKeepClearRects);
+ restrictedKeepClearRects.add(mKeepClearAccessibilityFocusRect);
+ }
+
try {
mWindowSession.reportKeepClearAreasChanged(mWindow, restrictedKeepClearRects,
unrestrictedKeepClearRects);
@@ -5050,6 +5071,7 @@ public final class ViewRootImpl implements ViewParent,
// Set the new focus host and node.
mAccessibilityFocusedHost = view;
mAccessibilityFocusedVirtualView = node;
+ updateKeepClearForAccessibilityFocusRect();
if (mAttachInfo.mThreadedRenderer != null) {
mAttachInfo.mThreadedRenderer.invalidateRoot();
@@ -5638,7 +5660,7 @@ public final class ViewRootImpl implements ViewParent,
systemGestureExclusionChanged();
} break;
case MSG_KEEP_CLEAR_RECTS_CHANGED: {
- keepClearRectsChanged();
+ keepClearRectsChanged(/* accessibilityFocusRectChanged= */ msg.arg1 == 1);
} break;
case MSG_REPORT_KEEP_CLEAR_RECTS: {
reportKeepClearAreasChanged();