From 4ee97aa498372b586e100d33a33d16cea7a58058 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Wed, 5 Jan 2022 20:18:02 +0800 Subject: Fix transfer splash screen view been called twice from onDraw postOnAnimation is not robust enough from remove the onDrawListener before next traversal, add a flag to to ensure that transfer splash screen view only been called once. Bug: 204125440 Test: atest SplashscreenTests Test: verify SplashScreenTests and SplashscreenParametrizedTest pass Change-Id: Id0e6d57b901b2dae45f5aa77e5571f9cf81b6e29 --- core/java/android/app/ActivityThread.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 57ad989d01c8..131bfd337b18 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4178,15 +4178,20 @@ public final class ActivityThread extends ClientTransactionHandler view.requestLayout(); view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { + private boolean mHandled = false; @Override public void onDraw() { + if (mHandled) { + return; + } + mHandled = true; // Transfer the splash screen view from shell to client. // Call syncTransferSplashscreenViewTransaction at the first onDraw so we can ensure // the client view is ready to show and we can use applyTransactionOnDraw to make // all transitions happen at the same frame. syncTransferSplashscreenViewTransaction( view, r.token, decorView, startingWindowLeash); - view.postOnAnimation(() -> view.getViewTreeObserver().removeOnDrawListener(this)); + view.post(() -> view.getViewTreeObserver().removeOnDrawListener(this)); } }); } -- cgit v1.2.3-59-g8ed1b