Merge "Refine the performance of updating the insets hint" into udc-qpr-dev

This commit is contained in:
Tiger Huang
2023-08-04 14:51:55 +00:00
committed by Android (Google) Code Review
2 changed files with 32 additions and 17 deletions

View File

@@ -81,8 +81,8 @@ class InsetsSourceProvider {
private boolean mIsLeashReadyForDispatching;
private final Rect mSourceFrame = new Rect();
private final Rect mLastSourceFrame = new Rect();
private final Rect mLastContainerBounds = new Rect();
private @NonNull Insets mInsetsHint = Insets.NONE;
private boolean mInsetsHintStale = true;
private @Flags int mFlagsFromFrameProvider;
private @Flags int mFlagsFromServer;
@@ -238,6 +238,10 @@ class InsetsSourceProvider {
mSource.setFlags(mFlagsFromFrameProvider | mFlagsFromServer);
}
updateSourceFrameForServerVisibility();
if (!mLastSourceFrame.equals(mSourceFrame)) {
mLastSourceFrame.set(mSourceFrame);
mInsetsHintStale = true;
}
if (mOverrideFrameProviders != null) {
// Not necessary to clear the mOverrideFrames here. It will be cleared every time the
@@ -279,28 +283,29 @@ class InsetsSourceProvider {
// visible. (i.e. No surface, pending insets that were given during layout, etc..)
if (mServerVisible) {
mSource.setFrame(mSourceFrame);
updateInsetsHint();
} else {
mSource.setFrame(0, 0, 0, 0);
}
}
// To be called when mSourceFrame or the window container bounds is changed.
private void updateInsetsHint() {
if (!mControllable || !mServerVisible) {
return;
}
final Rect bounds = mWindowContainer.getBounds();
if (mSourceFrame.equals(mLastSourceFrame) && bounds.equals(mLastContainerBounds)) {
return;
}
mLastSourceFrame.set(mSourceFrame);
mLastContainerBounds.set(bounds);
mInsetsHint = mSource.calculateInsets(bounds, true /* ignoreVisibility */);
void onWindowContainerBoundsChanged() {
mInsetsHintStale = true;
}
@VisibleForTesting
Insets getInsetsHint() {
if (!mServerVisible) {
return mInsetsHint;
}
final WindowState win = mWindowContainer.asWindowState();
if (win != null && win.mGivenInsetsPending) {
return mInsetsHint;
}
if (mInsetsHintStale) {
final Rect bounds = mWindowContainer.getBounds();
mInsetsHint = mSource.calculateInsets(bounds, true /* ignoreVisibility */);
mInsetsHintStale = false;
}
return mInsetsHint;
}
@@ -359,8 +364,9 @@ class InsetsSourceProvider {
mSetLeashPositionConsumer.accept(t);
}
}
if (!mControl.getInsetsHint().equals(mInsetsHint)) {
mControl.setInsetsHint(mInsetsHint);
final Insets insetsHint = getInsetsHint();
if (!mControl.getInsetsHint().equals(insetsHint)) {
mControl.setInsetsHint(insetsHint);
changed = true;
}
if (changed) {
@@ -494,7 +500,7 @@ class InsetsSourceProvider {
mControlTarget = target;
updateVisibility();
mControl = new InsetsSourceControl(mSource.getId(), mSource.getType(), leash,
mClientVisible, surfacePosition, mInsetsHint);
mClientVisible, surfacePosition, getInsetsHint());
ProtoLog.d(WM_DEBUG_WINDOW_INSETS,
"InsetsSource Control %s for target %s", mControl, mControlTarget);
@@ -605,6 +611,9 @@ class InsetsSourceProvider {
if (mControllable) {
pw.print(prefix + "mInsetsHint=");
pw.print(mInsetsHint);
if (mInsetsHintStale) {
pw.print(" stale");
}
pw.println();
}
pw.print(prefix);

View File

@@ -1143,6 +1143,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
void onResize() {
if (mControllableInsetProvider != null) {
mControllableInsetProvider.onWindowContainerBoundsChanged();
}
for (int i = mChildren.size() - 1; i >= 0; --i) {
final WindowContainer wc = mChildren.get(i);
wc.onParentResize();
@@ -1162,6 +1165,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
void onMovedByResize() {
if (mControllableInsetProvider != null) {
mControllableInsetProvider.onWindowContainerBoundsChanged();
}
for (int i = mChildren.size() - 1; i >= 0; --i) {
final WindowContainer wc = mChildren.get(i);
wc.onMovedByResize();