Merge "Fix reporting of unchanged keep clear areas" into tm-dev am: b8b8396a2c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18179544

Change-Id: I55b48463b6123d41d07a67ca905c4f0cdd1acf71
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Robert Horvath
2022-05-20 16:08:32 +00:00
committed by Automerger Merge Worker
2 changed files with 45 additions and 34 deletions

View File

@@ -222,7 +222,6 @@ import java.io.StringWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -800,8 +799,7 @@ public final class ViewRootImpl implements ViewParent,
new ViewRootRectTracker(v -> v.collectPreferKeepClearRects());
private final ViewRootRectTracker mUnrestrictedKeepClearRectsTracker =
new ViewRootRectTracker(v -> v.collectUnrestrictedPreferKeepClearRects());
private List<Rect> mPendingKeepClearAreas;
private List<Rect> mPendingUnrestrictedKeepClearAreas;
private boolean mHasPendingKeepClearAreaChange;
private IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection;
@@ -4819,45 +4817,31 @@ public final class ViewRootImpl implements ViewParent,
}
void keepClearRectsChanged() {
List<Rect> restrictedKeepClearRects = mKeepClearRectsTracker.computeChangedRects();
List<Rect> unrestrictedKeepClearRects =
mUnrestrictedKeepClearRectsTracker.computeChangedRects();
if ((restrictedKeepClearRects != null || unrestrictedKeepClearRects != null)
&& mView != null) {
if (restrictedKeepClearRects == null) {
restrictedKeepClearRects = Collections.emptyList();
}
if (unrestrictedKeepClearRects == null) {
unrestrictedKeepClearRects = Collections.emptyList();
}
boolean restrictedKeepClearRectsChanged = mKeepClearRectsTracker.computeChanges();
boolean unrestrictedKeepClearRectsChanged =
mUnrestrictedKeepClearRectsTracker.computeChanges();
if (mHandler.hasMessages(MSG_REPORT_KEEP_CLEAR_RECTS)) {
// Keep clear areas have been reported recently, wait before reporting new set
// of keep clear areas
mPendingKeepClearAreas = restrictedKeepClearRects;
mPendingUnrestrictedKeepClearAreas = unrestrictedKeepClearRects;
} else {
if ((restrictedKeepClearRectsChanged || unrestrictedKeepClearRectsChanged)
&& 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)) {
mHandler.sendEmptyMessageDelayed(MSG_REPORT_KEEP_CLEAR_RECTS,
KEEP_CLEAR_AREA_REPORT_RATE_MILLIS);
try {
mWindowSession.reportKeepClearAreasChanged(mWindow, restrictedKeepClearRects,
unrestrictedKeepClearRects);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
reportKeepClearAreasChanged();
}
}
}
void reportKeepClearAreasChanged() {
final List<Rect> restrictedKeepClearRects = mPendingKeepClearAreas;
final List<Rect> unrestrictedKeepClearRects = mPendingUnrestrictedKeepClearAreas;
if (restrictedKeepClearRects == null && unrestrictedKeepClearRects == null) {
if (!mHasPendingKeepClearAreaChange) {
return;
}
mHasPendingKeepClearAreaChange = false;
mPendingKeepClearAreas = null;
mPendingUnrestrictedKeepClearAreas = null;
final List<Rect> restrictedKeepClearRects = mKeepClearRectsTracker.getLastComputedRects();
final List<Rect> unrestrictedKeepClearRects =
mUnrestrictedKeepClearRectsTracker.getLastComputedRects();
try {
mWindowSession.reportKeepClearAreasChanged(mWindow, restrictedKeepClearRects,

View File

@@ -73,10 +73,25 @@ class ViewRootRectTracker {
}
/**
* @return all visible rects from all views in the global (root) coordinate system
* @return all Rects from all visible Views in the global (root) coordinate system,
* or {@code null} if Rects are unchanged since the last call to this method.
*/
@Nullable
public List<Rect> computeChangedRects() {
if (computeChanges()) {
return mRects;
}
return null;
}
/**
* Computes changes to all Rects from all Views.
* After calling this method, the updated list of Rects can be retrieved
* with {@link #getLastComputedRects()}.
*
* @return {@code true} if there were changes, {@code false} otherwise.
*/
public boolean computeChanges() {
boolean changed = mRootRectsChanged;
final Iterator<ViewInfo> i = mViewInfos.iterator();
final List<Rect> rects = new ArrayList<>(mRootRects);
@@ -100,10 +115,22 @@ class ViewRootRectTracker {
mRootRectsChanged = false;
if (!mRects.equals(rects)) {
mRects = rects;
return rects;
return true;
}
}
return null;
return false;
}
/**
* Returns a List of all Rects from all visible Views in the global (root) coordinate system.
* This list is only updated when calling {@link #computeChanges()} or
* {@link #computeChangedRects()}.
*
* @return all Rects from all visible Views in the global (root) coordinate system
*/
@NonNull
public List<Rect> getLastComputedRects() {
return mRects;
}
/**