summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Horvath <robhor@google.com> 2022-06-27 06:53:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-06-27 06:53:25 +0000
commit011618a551db9aceabfd85a4185e15cbd4b9fabc (patch)
tree0563b338b264ab667472b202f1ba61e4da9ae62b
parent277091278d78fcd871b1f9a6e57bd9d079297bd6 (diff)
parentc48d9032baa83abbdf6c804e0cf4a6ebafdd9ae0 (diff)
Merge "Mark accessibility focus bounds as keep clear area"
-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 bc7da13b66db..657c0b7801b5 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -805,6 +805,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;
@@ -4865,13 +4866,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)) {
@@ -4888,10 +4903,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);
@@ -5091,6 +5112,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();
@@ -5679,7 +5701,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();