Update requested state after applying pending frames am: 23c75281ef

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

Change-Id: I955a32723913c7cc238ce38e8c97328295dae27c
This commit is contained in:
Tiger Huang
2020-08-19 15:58:11 +00:00
committed by Automerger Merge Worker
2 changed files with 20 additions and 3 deletions

View File

@@ -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));
});
}