From 93ea15a536e19d6e72a82ca0edb87f404650a3f8 Mon Sep 17 00:00:00 2001 From: Tarandeep Singh Date: Tue, 26 Nov 2019 11:09:14 -0800 Subject: [PATCH] Prevent Insets side visibility change during animation If app requests to show IME as soon as app resumes, the animation is prepared and IME window is set visibile/invisible at start of the animation. Also, control is set to the window when it receives focus. This results in control showing the IME before even animation starts creating a flicker. Solution is to not applyVisibility when control is set if IME (or another side) is already animating. Fix: 144503524 Test: Manually using steps in bug. atest InsetsControllerTest InsetsSourceConsumerTest Change-Id: I5271d906772510cd819f75dc8eed141f4248b34f --- core/java/android/view/InsetsController.java | 5 +++++ core/java/android/view/InsetsSourceConsumer.java | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 3c93bb7a59b24..bc70d634b4ecf 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -467,6 +467,10 @@ public class InsetsController implements WindowInsetsController { } } + boolean isAnimating() { + return mAnimationDirection != DIRECTION_NONE; + } + private InsetsSourceConsumer createConsumerOfType(int type) { if (type == ITYPE_IME) { return new ImeInsetsSourceConsumer(mState, Transaction::new, this); @@ -514,6 +518,7 @@ public class InsetsController implements WindowInsetsController { } else { hideDirectly(types); } + mAnimationDirection = show ? DIRECTION_SHOW : DIRECTION_HIDE; mAnimator = ObjectAnimator.ofObject( controller, new InsetsProperty(), diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index b1caf1872de2d..c6d9898a425cd 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -167,7 +167,8 @@ public class InsetsSourceConsumer { } private void applyHiddenToControl() { - if (mSourceControl == null || mSourceControl.getLeash() == null) { + if (mSourceControl == null || mSourceControl.getLeash() == null + || mController.isAnimating()) { return; }