From 21d857a21f36ac17faf613c7547e7a913697d045 Mon Sep 17 00:00:00 2001 From: Andy Wickham Date: Mon, 10 Apr 2023 19:02:44 -0700 Subject: [PATCH] Fix single frame flicker for views reacting to keyboard insets. This includes Folders, bottom apps searchbar, work apps button. The issue is that the view was being drawn between onStart and onProgress. Before onStart is called, the final keyboard insets are dispatched to determine the view's final state, so this draw captured this otherwise invisible state. Normally, onProgress would be called first, effectively resetting the view; but for example, the transition from closing the apps drawer forces a draw prematurely. Fix: 265830720 Test: Manual Flag: N/A, but improves the ENABLE_FLOATING_SEARCH_BAR flag. Change-Id: I818cb75628dec6dcc69e5f4b8ae554c2245dceca --- .../anim/KeyboardInsetAnimationCallback.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java index 3863dc1962..b911928e36 100644 --- a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java +++ b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java @@ -27,7 +27,16 @@ import com.android.launcher3.Utilities; import java.util.List; /** - * Callback that animates views above the IME + * Callback that animates views above the IME. + *

+ * The expected stages of a keyboard transition are: + *

+ *

*/ @RequiresApi(api = Build.VERSION_CODES.R) public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callback { @@ -46,6 +55,18 @@ public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callba mInitialTranslation = mView.getTranslationY(); } + @Override + public WindowInsetsAnimation.Bounds onStart(WindowInsetsAnimation animation, + WindowInsetsAnimation.Bounds bounds) { + // Final insets have temporarily been applied, so store the current translation as final. + mTerminalTranslation = mView.getTranslationY(); + // Reset the translation in case the view is drawn before onProgress gets called. + mView.setTranslationY(mInitialTranslation); + if (mView instanceof KeyboardInsetListener) { + ((KeyboardInsetListener) mView).onTranslationStart(); + } + return super.onStart(animation, bounds); + } @Override public WindowInsets onProgress(WindowInsets windowInsets, List list) { @@ -72,19 +93,8 @@ public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callba return windowInsets; } - @Override - public WindowInsetsAnimation.Bounds onStart(WindowInsetsAnimation animation, - WindowInsetsAnimation.Bounds bounds) { - mTerminalTranslation = mView.getTranslationY(); - if (mView instanceof KeyboardInsetListener) { - ((KeyboardInsetListener) mView).onTranslationStart(); - } - return super.onStart(animation, bounds); - } - @Override public void onEnd(WindowInsetsAnimation animation) { - mView.setTranslationY(mTerminalTranslation); if (mView instanceof KeyboardInsetListener) { ((KeyboardInsetListener) mView).onTranslationEnd(); }