Stop processing if the new control equals the current one

InsetsSourceConsumer#setControl compares the identities between the new
control and current one. If they are the same, the function stops
processing. However, the instance of the control returned from relayout
will always be different, which makes setControl process more than
expected.

This CL overrides InsetsSourceControl#equals, and use it to decide if we
should do further processing in setControl.

Bug: 185193241
Fix: 185460364
Test: steps in the bug
Change-Id: If347df353202ef441b57dabccfd0ef254ec72477
This commit is contained in:
Tiger Huang
2021-04-17 02:37:23 +08:00
parent e7f2887e7d
commit 55581522ea
2 changed files with 34 additions and 1 deletions

View File

@@ -46,6 +46,7 @@ import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
import java.util.function.Supplier;
/**
@@ -120,7 +121,11 @@ public class InsetsSourceConsumer {
ImeTracing.getInstance().triggerClientDump("InsetsSourceConsumer#setControl",
mController.getHost().getInputMethodManager(), null /* icProto */);
}
if (mSourceControl == control) {
if (Objects.equals(mSourceControl, control)) {
if (mSourceControl != null && mSourceControl != control) {
mSourceControl.release(SurfaceControl::release);
mSourceControl = control;
}
return;
}
SurfaceControl oldLeash = mSourceControl != null ? mSourceControl.getLeash() : null;

View File

@@ -152,6 +152,34 @@ public class InsetsSourceControl implements Parcelable {
}
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final InsetsSourceControl that = (InsetsSourceControl) o;
final SurfaceControl thatLeash = that.mLeash;
return mType == that.mType
&& ((mLeash == thatLeash)
|| (mLeash != null && thatLeash != null && mLeash.isSameSurface(thatLeash)))
&& mSurfacePosition.equals(that.mSurfacePosition)
&& mInsetsHint.equals(that.mInsetsHint)
&& mSkipAnimationOnce == that.mSkipAnimationOnce;
}
@Override
public int hashCode() {
int result = mType;
result = 31 * result + (mLeash != null ? mLeash.hashCode() : 0);
result = 31 * result + mSurfacePosition.hashCode();
result = 31 * result + mInsetsHint.hashCode();
result = 31 * result + (mSkipAnimationOnce ? 1 : 0);
return result;
}
public void dump(String prefix, PrintWriter pw) {
pw.print(prefix);
pw.print("InsetsSourceControl type="); pw.print(InsetsState.typeToString(mType));