From da737e714968cce26708db3940e6de3505baef70 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Wed, 24 Nov 2021 19:57:52 +0100 Subject: [PATCH] Don't set background color if TDA doesn't have a valid surface This is something that sometimes occurs in tests since the detaching of the TDA in not necesseraily synchronized with animations Test: atest CtsWindowManagerDeviceTestCases:MultiDisplaySystemDecorationTests Bug: 207667555 Bug: 209936970 Merged-In: I9881453ba14cba4f219861ec4449f2baa8058b57 Change-Id: I9881453ba14cba4f219861ec4449f2baa8058b57 (cherry picked from commit e644ff610220c9f8196cfa982d735e678b121bdc) --- .../com/android/server/wm/TaskDisplayArea.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 5e1eac8d62a86..db6d3ce69cc87 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -975,18 +975,23 @@ final class TaskDisplayArea extends DisplayArea { Color color = Color.valueOf(colorInt); mColorLayerCounter++; - getPendingTransaction() - .setColor(mSurfaceControl, new float[]{color.red(), color.green(), color.blue()}); - - scheduleAnimation(); + // Only apply the background color if the TDA is actually attached and has a valid surface + // to set the background color on. We still want to keep track of the background color state + // even if we are not showing it for when/if the TDA is reattached and gets a valid surface + if (mSurfaceControl != null) { + getPendingTransaction() + .setColor(mSurfaceControl, + new float[]{color.red(), color.green(), color.blue()}); + scheduleAnimation(); + } } void clearBackgroundColor() { mColorLayerCounter--; // Only clear the color layer if we have received the same amounts of clear as set - // requests. - if (mColorLayerCounter == 0) { + // requests and TDA has a non null surface control (i.e. is attached) + if (mColorLayerCounter == 0 && mSurfaceControl != null) { getPendingTransaction().unsetColor(mSurfaceControl); scheduleAnimation(); }