summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Marzia Favaro <marziana@google.com> 2025-03-21 10:47:43 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-21 10:47:43 -0700
commit452a3d6dbc0553b4bc8ca65e097ddfe2ed9e9745 (patch)
treeb69ce1bcddf262bc6906f63394ff62ad8228f6aa
parent39b795df06f32407dcde756262f513a079817790 (diff)
parent4ea8562fd079059d1502eb3872ca92a4a2713215 (diff)
Merge "Deep copy exclusion rects to be able to compare them between calls" into main
-rw-r--r--core/java/android/view/View.java67
1 files changed, 42 insertions, 25 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index f32ce6f1d6e4..1213d173ab3b 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5179,9 +5179,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* This lives here since it's only valid for interactive views. This list is null
* until its first use.
*/
- private List<Rect> mSystemGestureExclusionRects = null;
- private List<Rect> mKeepClearRects = null;
- private List<Rect> mUnrestrictedKeepClearRects = null;
+ private ArrayList<Rect> mSystemGestureExclusionRects = null;
+ private ArrayList<Rect> mKeepClearRects = null;
+ private ArrayList<Rect> mUnrestrictedKeepClearRects = null;
private boolean mPreferKeepClear = false;
private Rect mHandwritingArea = null;
@@ -12891,21 +12891,34 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
final ListenerInfo info = getListenerInfo();
final boolean rectsChanged = !reduceChangedExclusionRectsMsgs()
- || !Objects.equals(info.mSystemGestureExclusionRects, rects);
- if (info.mSystemGestureExclusionRects != null) {
- if (rectsChanged) {
- info.mSystemGestureExclusionRects.clear();
- info.mSystemGestureExclusionRects.addAll(rects);
- }
- } else {
- info.mSystemGestureExclusionRects = new ArrayList<>(rects);
+ || !Objects.deepEquals(info.mSystemGestureExclusionRects, rects);
+ if (info.mSystemGestureExclusionRects == null) {
+ info.mSystemGestureExclusionRects = new ArrayList<>();
}
if (rectsChanged) {
+ deepCopyRectsObjectRecycling(info.mSystemGestureExclusionRects, rects);
updatePositionUpdateListener();
postUpdate(this::updateSystemGestureExclusionRects);
}
}
+ private void deepCopyRectsObjectRecycling(@NonNull ArrayList<Rect> dest, List<Rect> src) {
+ dest.ensureCapacity(src.size());
+ for (int i = 0; i < src.size(); i++) {
+ if (i < dest.size()) {
+ // Replace if there is an old rect to refresh
+ dest.get(i).set(src.get(i));
+ } else {
+ // Add a rect if the list enlarged
+ dest.add(Rect.copyOrNull(src.get(i)));
+ }
+ }
+ while (dest.size() > src.size()) {
+ // Remove elements if the list shrank
+ dest.removeLast();
+ }
+ }
+
private void updatePositionUpdateListener() {
final ListenerInfo info = getListenerInfo();
if (getSystemGestureExclusionRects().isEmpty()
@@ -13031,14 +13044,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
public final void setPreferKeepClearRects(@NonNull List<Rect> rects) {
final ListenerInfo info = getListenerInfo();
- if (info.mKeepClearRects != null) {
- info.mKeepClearRects.clear();
- info.mKeepClearRects.addAll(rects);
- } else {
- info.mKeepClearRects = new ArrayList<>(rects);
+ final boolean rectsChanged = !reduceChangedExclusionRectsMsgs()
+ || !Objects.deepEquals(info.mKeepClearRects, rects);
+ if (info.mKeepClearRects == null) {
+ info.mKeepClearRects = new ArrayList<>();
+ }
+ if (rectsChanged) {
+ deepCopyRectsObjectRecycling(info.mKeepClearRects, rects);
+ updatePositionUpdateListener();
+ postUpdate(this::updateKeepClearRects);
}
- updatePositionUpdateListener();
- postUpdate(this::updateKeepClearRects);
}
/**
@@ -13076,14 +13091,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@RequiresPermission(android.Manifest.permission.SET_UNRESTRICTED_KEEP_CLEAR_AREAS)
public final void setUnrestrictedPreferKeepClearRects(@NonNull List<Rect> rects) {
final ListenerInfo info = getListenerInfo();
- if (info.mUnrestrictedKeepClearRects != null) {
- info.mUnrestrictedKeepClearRects.clear();
- info.mUnrestrictedKeepClearRects.addAll(rects);
- } else {
- info.mUnrestrictedKeepClearRects = new ArrayList<>(rects);
+ final boolean rectsChanged = !reduceChangedExclusionRectsMsgs()
+ || !Objects.deepEquals(info.mUnrestrictedKeepClearRects, rects);
+ if (info.mUnrestrictedKeepClearRects == null) {
+ info.mUnrestrictedKeepClearRects = new ArrayList<>();
+ }
+ if (rectsChanged) {
+ deepCopyRectsObjectRecycling(info.mUnrestrictedKeepClearRects, rects);
+ updatePositionUpdateListener();
+ postUpdate(this::updateKeepClearRects);
}
- updatePositionUpdateListener();
- postUpdate(this::updateKeepClearRects);
}
/**