From 1f83308556cb5bb0df3fb64f03b9b68f0aad6c0d Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 4 Aug 2017 18:06:56 +0200 Subject: [PATCH] Defer updating dim layers if layout is deferred When a translucent activity is on top of launcher and the activity is animated away, we update the layers too early in case the activity window is dimming. After starting the launcher, launcher is on top of activity already in the hierarchy, but we haven't started the transtion yet which would prevent the launcher to be visible on top of activity by the anim layer adjustment. To fix this, we prevent updating the layers if layout is currently deferred. Ideally we would do the whole activityStart in one surface transaction but that's way too risky at this point. Test: Open translucent dimming activity over launcher, press home, ensure no flickering. Test: go/wm-smoke Change-Id: I72b8f5f555b555646121355c19cf7813e4f8d7a3 Fixes: 64206558 --- services/core/java/com/android/server/wm/WindowState.java | 5 +++++ .../core/java/com/android/server/wm/WindowSurfacePlacer.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 58819144949e4..1ec90b0c0a50c 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2036,6 +2036,11 @@ class WindowState extends WindowContainer implements WindowManagerP if (dc == null) { return; } + + // If layout is currently deferred, we want to hold of with updating the layers. + if (mService.mWindowPlacerLocked.isLayoutDeferred()) { + return; + } final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser(); if (dimLayerUser != null && dc.mDimLayerController.isDimming(dimLayerUser, mWinAnimator)) { // Force an animation pass just to update the mDimLayer layer. diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 690989251f618..581b0447dafc3 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -127,6 +127,10 @@ class WindowSurfacePlacer { } } + boolean isLayoutDeferred() { + return mDeferDepth > 0; + } + final void performSurfacePlacement() { performSurfacePlacement(false /* force */); }