Merge "Exclude non-observable insets change" into rvc-dev

This commit is contained in:
Jorim Jaggi
2020-06-11 12:15:49 +00:00
committed by Android (Google) Code Review
6 changed files with 35 additions and 10 deletions

View File

@@ -575,21 +575,23 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
@VisibleForTesting @VisibleForTesting
public boolean onStateChanged(InsetsState state) { public boolean onStateChanged(InsetsState state) {
boolean localStateChanged = !mState.equals(state, true /* excludingCaptionInsets */) boolean stateChanged = !mState.equals(state, true /* excludingCaptionInsets */,
false /* excludeInvisibleIme */)
|| !captionInsetsUnchanged(); || !captionInsetsUnchanged();
if (!localStateChanged && mLastDispatchedState.equals(state)) { if (!stateChanged && mLastDispatchedState.equals(state)) {
return false; return false;
} }
if (DEBUG) Log.d(TAG, "onStateChanged: " + state); if (DEBUG) Log.d(TAG, "onStateChanged: " + state);
updateState(state); updateState(state);
boolean localStateChanged = !mState.equals(mLastDispatchedState,
true /* excludingCaptionInsets */, true /* excludeInvisibleIme */);
mLastDispatchedState.set(state, true /* copySources */); mLastDispatchedState.set(state, true /* copySources */);
applyLocalVisibilityOverride(); applyLocalVisibilityOverride();
if (localStateChanged) { if (localStateChanged) {
if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged"); if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged, send state to WM: " + mState);
mHost.notifyInsetsChanged(); mHost.notifyInsetsChanged();
}
if (!mState.equals(mLastDispatchedState, true /* excludingCaptionInsets */)) {
if (DEBUG) Log.d(TAG, "onStateChanged, send state to WM: " + mState);
updateRequestedState(); updateRequestedState();
} }
return true; return true;

View File

@@ -191,6 +191,14 @@ public class InsetsSource implements Parcelable {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
return equals(o, false);
}
/**
* @param excludeInvisibleImeFrames If {@link InsetsState#ITYPE_IME} frames should be ignored
* when IME is not visible.
*/
public boolean equals(Object o, boolean excludeInvisibleImeFrames) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
@@ -198,6 +206,7 @@ public class InsetsSource implements Parcelable {
if (mType != that.mType) return false; if (mType != that.mType) return false;
if (mVisible != that.mVisible) return false; if (mVisible != that.mVisible) return false;
if (excludeInvisibleImeFrames && !mVisible && mType == ITYPE_IME) return true;
if (!Objects.equals(mVisibleFrame, that.mVisibleFrame)) return false; if (!Objects.equals(mVisibleFrame, that.mVisibleFrame)) return false;
return mFrame.equals(that.mFrame); return mFrame.equals(that.mFrame);
} }

View File

@@ -555,7 +555,7 @@ public class InsetsState implements Parcelable {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
return equals(o, false); return equals(o, false, false);
} }
/** /**
@@ -564,10 +564,13 @@ public class InsetsState implements Parcelable {
* excluded. * excluded.
* @param excludingCaptionInsets {@code true} if we want to compare two InsetsState objects but * @param excludingCaptionInsets {@code true} if we want to compare two InsetsState objects but
* ignore the caption insets source value. * ignore the caption insets source value.
* @param excludeInvisibleImeFrames If {@link #ITYPE_IME} frames should be ignored when IME is
* not visible.
* @return {@code true} if the two InsetsState objects are equal, {@code false} otherwise. * @return {@code true} if the two InsetsState objects are equal, {@code false} otherwise.
*/ */
@VisibleForTesting @VisibleForTesting
public boolean equals(Object o, boolean excludingCaptionInsets) { public boolean equals(Object o, boolean excludingCaptionInsets,
boolean excludeInvisibleImeFrames) {
if (this == o) { return true; } if (this == o) { return true; }
if (o == null || getClass() != o.getClass()) { return false; } if (o == null || getClass() != o.getClass()) { return false; }
@@ -598,7 +601,7 @@ public class InsetsState implements Parcelable {
if (otherSource == null) { if (otherSource == null) {
return false; return false;
} }
if (!otherSource.equals(source)) { if (!otherSource.equals(source, excludeInvisibleImeFrames)) {
return false; return false;
} }
} }

View File

@@ -678,7 +678,8 @@ public class InsetsControllerTest {
final InsetsState currentState = new InsetsState(mController.getState()); final InsetsState currentState = new InsetsState(mController.getState());
// The caption bar source should be synced with the info in mAttachInfo. // The caption bar source should be synced with the info in mAttachInfo.
assertEquals(captionFrame, currentState.peekSource(ITYPE_CAPTION_BAR).getFrame()); assertEquals(captionFrame, currentState.peekSource(ITYPE_CAPTION_BAR).getFrame());
assertTrue(currentState.equals(state, true /* excludingCaptionInsets*/)); assertTrue(currentState.equals(state, true /* excludingCaptionInsets*/,
true /* excludeInvisibleIme */));
mController.setCaptionInsetsHeight(0); mController.setCaptionInsetsHeight(0);
mController.onStateChanged(state); mController.onStateChanged(state);
// The caption bar source should not be there at all, because we don't add empty // The caption bar source should not be there at all, because we don't add empty

View File

@@ -275,6 +275,15 @@ public class InsetsStateTest {
assertEqualsAndHashCode(); assertEqualsAndHashCode();
} }
@Test
public void testEquals_excludeInvisibleIme() {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 0, 100, 100));
mState.getSource(ITYPE_IME).setVisible(false);
mState2.getSource(ITYPE_IME).setFrame(new Rect(0, 0, 100, 200));
mState2.getSource(ITYPE_IME).setVisible(false);
assertTrue(mState2.equals(mState, true, true /* excludeInvisibleIme */));
}
@Test @Test
public void testParcelUnparcel() { public void testParcelUnparcel() {
mState.getSource(ITYPE_IME).setFrame(new Rect(0, 0, 100, 100)); mState.getSource(ITYPE_IME).setFrame(new Rect(0, 0, 100, 100));

View File

@@ -178,6 +178,7 @@ class InsetsStateController {
if (imeSource != null && imeSource.isVisible()) { if (imeSource != null && imeSource.isVisible()) {
imeSource = new InsetsSource(imeSource); imeSource = new InsetsSource(imeSource);
imeSource.setVisible(false); imeSource.setVisible(false);
imeSource.setFrame(0, 0, 0, 0);
state = new InsetsState(state); state = new InsetsState(state);
state.addSource(imeSource); state.addSource(imeSource);
} }