From a5f3e90212a71816ea2baec0ea71e78651c5c3ed Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Thu, 23 Sep 2021 19:52:04 +0200 Subject: [PATCH] Stop relying on background color attribute to set task transition background Because the background attribute used to have a different use some apps still set it and it means we could run transitions with unexpected background colors Test: Existing Fixes: 200763116 Merged-In: Id42f52760cb9a681c6c33f3c261d7db5e2f71af3 Change-Id: Id42f52760cb9a681c6c33f3c261d7db5e2f71af3 --- .../android/view/animation/Animation.java | 10 ------ .../android/server/wm/WindowContainer.java | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index b296d6f6a052f..81e2f3ca98ecc 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -19,7 +19,6 @@ package android.view.animation; import android.annotation.AnimRes; import android.annotation.ColorInt; import android.annotation.InterpolatorRes; -import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.TypedArray; @@ -270,15 +269,6 @@ public abstract class Animation implements Cloneable { a.recycle(); - Context uiContext = ActivityThread.currentActivityThread().getSystemUiContext(); - TypedArray uiStyledAttrs = uiContext - .obtainStyledAttributes(attrs, com.android.internal.R.styleable.Animation); - - setBackgroundColor( - uiStyledAttrs.getColor(com.android.internal.R.styleable.Animation_background, 0)); - - uiStyledAttrs.recycle(); - if (resID > 0) { setInterpolator(context, resID); } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index d9a8883e299ed..d99aed1b409a0 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -30,6 +30,10 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.os.UserHandle.USER_NULL; import static android.view.SurfaceControl.Transaction; import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; +import static android.view.WindowManager.TRANSIT_OLD_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_OLD_TASK_OPEN; +import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_BACK; +import static android.view.WindowManager.TRANSIT_OLD_TASK_TO_FRONT; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS_ANIM; @@ -59,10 +63,13 @@ import static com.android.server.wm.WindowManagerService.logWithStack; import static com.android.server.wm.WindowStateAnimator.ROOT_TASK_CLIP_AFTER_ANIM; import android.annotation.CallSuper; +import android.annotation.ColorInt; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.ActivityThread; import android.app.WindowConfiguration; +import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Point; @@ -88,6 +95,7 @@ import android.view.animation.Animation; import android.window.IWindowContainerToken; import android.window.WindowContainerToken; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.ToBooleanFunction; @@ -2732,24 +2740,23 @@ class WindowContainer extends ConfigurationContainer< } TaskDisplayArea taskDisplayArea = getTaskDisplayArea(); - int backgroundColor = adapter.getBackgroundColor(); + boolean isSettingBackgroundColor = taskDisplayArea != null + && isTransitionWithBackgroundColor(transit); - boolean shouldSetBackgroundColor = taskDisplayArea != null && backgroundColor != 0; + if (isSettingBackgroundColor) { + Context uiContext = ActivityThread.currentActivityThread().getSystemUiContext(); + @ColorInt int backgroundColor = uiContext.getColor(R.color.overview_background); - if (shouldSetBackgroundColor) { taskDisplayArea.setBackgroundColor(backgroundColor); } - Runnable clearColorBackground = () -> { - if (shouldSetBackgroundColor) { - taskDisplayArea.clearBackgroundColor(); - } - }; + final Runnable cleanUpCallback = isSettingBackgroundColor + ? taskDisplayArea::clearBackgroundColor : () -> {}; startAnimation(getPendingTransaction(), adapter, !isVisible(), ANIMATION_TYPE_APP_TRANSITION, - (type, anim) -> clearColorBackground.run(), - clearColorBackground); + (type, anim) -> cleanUpCallback.run(), + cleanUpCallback); if (adapter.getShowWallpaper()) { getDisplayContent().pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; @@ -2761,6 +2768,13 @@ class WindowContainer extends ConfigurationContainer< } } + private boolean isTransitionWithBackgroundColor(@TransitionOldType int transit) { + return transit == TRANSIT_OLD_TASK_OPEN + || transit == TRANSIT_OLD_TASK_CLOSE + || transit == TRANSIT_OLD_TASK_TO_FRONT + || transit == TRANSIT_OLD_TASK_TO_BACK; + } + final SurfaceAnimationRunner getSurfaceAnimationRunner() { return mWmService.mSurfaceAnimationRunner; }