From 65269739520cba0a072f05f20850dcd720d8ce6a Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 23 Nov 2021 05:20:56 +0000 Subject: [PATCH] Prevent setting launcher layer has opaque when there is content behind - This can prevent the layered content behind to not be visible (and since launcher draws a cutout and the wallpaper isn't shown, may result in a black rect. We only specialize for this case while Launcher is in Overview. - Also don't need to defer updating drawsBelowRecents, this can result in the state not being reflected since it runs after the last update of the transform params Bug: 205789573 Test: Swipe up from app and ensure behind layers are visible (also ensure this doesn't affect blur during the swipe or optimizations after you leave overview) Change-Id: I07689b3d9b65708797576e5fbefe12fb1f544119 --- .../launcher3/statehandlers/DepthController.java | 16 ++++++++++++---- .../uioverrides/RecentsViewStateController.java | 7 +++++++ .../quickstep/fallback/FallbackRecentsView.java | 5 ++--- .../quickstep/views/LauncherRecentsView.java | 5 ++--- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index 9d70cfaee6..e1d89a13dd 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -44,7 +44,6 @@ import com.android.launcher3.states.StateAnimationConfig; import com.android.systemui.shared.system.BlurUtils; import com.android.systemui.shared.system.WallpaperManagerCompat; -import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.function.Consumer; @@ -156,6 +155,10 @@ public class DepthController implements StateHandler, // Workaround for animating the depth when multiwindow mode changes. private boolean mIgnoreStateChangesDuringMultiWindowAnimation = false; + // Hints that there is potentially content behind Launcher and that we shouldn't optimize by + // marking the launcher surface as opaque. Only used in certain Launcher states. + private boolean mHasContentBehindLauncher; + private View.OnAttachStateChangeListener mOnAttachListener; public DepthController(Launcher l) { @@ -199,6 +202,10 @@ public class DepthController implements StateHandler, mLauncher.getScrimView().addOpaquenessListener(mOpaquenessListener); } + public void setHasContentBehindLauncher(boolean hasContentBehindLauncher) { + mHasContentBehindLauncher = hasContentBehindLauncher; + } + /** * Sets if the underlying activity is started or not */ @@ -311,13 +318,14 @@ public class DepthController implements StateHandler, } if (supportsBlur) { - boolean opaque = mLauncher.getScrimView().isFullyOpaque(); + boolean hasOpaqueBg = mLauncher.getScrimView().isFullyOpaque(); + boolean isSurfaceOpaque = !mHasContentBehindLauncher && hasOpaqueBg; - mCurrentBlur = !mCrossWindowBlursEnabled || mBlurDisabledForAppLaunch + mCurrentBlur = !mCrossWindowBlursEnabled || mBlurDisabledForAppLaunch || hasOpaqueBg ? 0 : (int) (depth * mMaxBlurRadius); SurfaceControl.Transaction transaction = new SurfaceControl.Transaction() .setBackgroundBlurRadius(mSurface, mCurrentBlur) - .setOpaque(mSurface, opaque); + .setOpaque(mSurface, isSurfaceOpaque); // Set early wake-up flags when we know we're executing an expensive operation, this way // SurfaceFlinger will adjust its internal offsets to avoid jank. diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index 1f744e1953..2f150135af 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -63,6 +63,9 @@ public final class RecentsViewStateController extends } setAlphas(PropertySetter.NO_ANIM_PROPERTY_SETTER, new StateAnimationConfig(), state); mRecentsView.setFullscreenProgress(state.getOverviewFullscreenProgress()); + // In Overview, we may be layering app surfaces behind Launcher, so we need to notify + // DepthController to prevent optimizations which might occlude the layers behind + mLauncher.getDepthController().setHasContentBehindLauncher(state.overviewUi); } @Override @@ -78,6 +81,10 @@ public final class RecentsViewStateController extends builder.addListener( AnimatorListeners.forSuccessCallback(mRecentsView::resetTaskVisuals)); } + // In Overview, we may be layering app surfaces behind Launcher, so we need to notify + // DepthController to prevent optimizations which might occlude the layers behind + builder.addListener(AnimatorListeners.forSuccessCallback(() -> + mLauncher.getDepthController().setHasContentBehindLauncher(toState.overviewUi))); // Create or dismiss split screen select animations LauncherState currentState = mLauncher.getStateManager().getState(); diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 95095fa8eb..22f67d2960 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -16,7 +16,6 @@ package com.android.quickstep.fallback; import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS; -import static com.android.quickstep.ViewUtils.postFrameDrawn; import static com.android.quickstep.fallback.RecentsState.DEFAULT; import static com.android.quickstep.fallback.RecentsState.HOME; import static com.android.quickstep.fallback.RecentsState.MODAL_TASK; @@ -224,8 +223,8 @@ public class FallbackRecentsView extends RecentsView runActionOnRemoteHandles(remoteTargetHandle -> - remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true))); + runActionOnRemoteHandles(remoteTargetHandle -> + remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true)); } } diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 3cba3921b2..a2e9e571cb 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -21,7 +21,6 @@ import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW_MODAL_TASK; import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT; import static com.android.launcher3.LauncherState.SPRING_LOADED; -import static com.android.quickstep.ViewUtils.postFrameDrawn; import android.annotation.TargetApi; import android.content.Context; @@ -110,8 +109,8 @@ public class LauncherRecentsView extends RecentsView runActionOnRemoteHandles(remoteTargetHandle -> - remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true))); + runActionOnRemoteHandles(remoteTargetHandle -> + remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true)); } }