Merge "Update requested state after applying pending frames" into rvc-qpr-dev am: 943589cf45

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

Change-Id: Ia3b2ca6b9118da1c2af064033e67d98c6d2835df
This commit is contained in:
Tiger Huang
2020-08-19 00:37:33 +00:00
committed by Automerger Merge Worker
2 changed files with 21 additions and 4 deletions

View File

@@ -629,7 +629,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged");
mHost.notifyInsetsChanged();
}
if (!mState.equals(state, true /* excludingCaptionInsets */,
if (!mState.equals(mLastDispatchedState, true /* excludingCaptionInsets */,
true /* excludeInvisibleIme */)) {
if (DEBUG) Log.d(TAG, "onStateChanged, send state to WM: " + mState);
updateRequestedState();
@@ -1138,15 +1138,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
if (invokeCallback) {
control.cancel();
}
boolean stateChanged = false;
for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
RunningAnimation runningAnimation = mRunningAnimations.get(i);
if (runningAnimation.runner == control) {
mRunningAnimations.remove(i);
ArraySet<Integer> types = toInternalType(control.getTypes());
for (int j = types.size() - 1; j >= 0; j--) {
if (getSourceConsumer(types.valueAt(j)).notifyAnimationFinished()) {
mHost.notifyInsetsChanged();
}
stateChanged |= getSourceConsumer(types.valueAt(j)).notifyAnimationFinished();
}
if (invokeCallback && runningAnimation.startDispatched) {
dispatchAnimationEnd(runningAnimation.runner.getAnimation());
@@ -1154,6 +1153,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
break;
}
}
if (stateChanged) {
mHost.notifyInsetsChanged();
updateRequestedState();
}
}
private void applyLocalVisibilityOverride() {

View File

@@ -746,6 +746,20 @@ public class InsetsControllerTest {
mController.onControlsChanged(createSingletonControl(ITYPE_IME));
assertEquals(newState.getSource(ITYPE_IME),
mTestHost.getModifiedState().peekSource(ITYPE_IME));
// The modified frames cannot be updated if there is an animation.
mController.onControlsChanged(createSingletonControl(ITYPE_NAVIGATION_BAR));
mController.hide(navigationBars());
newState = new InsetsState(mController.getState(), true /* copySource */);
newState.getSource(ITYPE_NAVIGATION_BAR).getFrame().top--;
mController.onStateChanged(newState);
assertNotEquals(newState.getSource(ITYPE_NAVIGATION_BAR),
mTestHost.getModifiedState().peekSource(ITYPE_NAVIGATION_BAR));
// The modified frames can be updated while the animation is done.
mController.cancelExistingAnimations();
assertEquals(newState.getSource(ITYPE_NAVIGATION_BAR),
mTestHost.getModifiedState().peekSource(ITYPE_NAVIGATION_BAR));
});
}