From cfeb154a1b080e2f2859c8ce1322abba3b866276 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Wed, 23 Mar 2022 17:20:46 +0800 Subject: [PATCH] Reduce flicker when resize animation When resize split, split decor use fade in animation but bottom larger than bounds area is black, it will make color change from black to decor background color and it just like flicker. To avoid this, we should add back using of am#setSplitScreenResizing which could make black backgound to color similar to app content background. And it should also reduce flicker while snap divider to dismiss split. Bug: 220985951 Bug: 221178408 Test: manual Test: pass existing tests Change-Id: I961a4d3ab4f3552fd5ace4b3a6742afa980f073c --- .../wm/shell/splitscreen/StageCoordinator.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 3593eddf4b3b8..e150cf9cd112f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -171,6 +171,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, private boolean mShouldUpdateRecents; private boolean mExitSplitScreenOnHide; private boolean mIsDividerRemoteAnimating; + private boolean mResizingSplits; /** The target stage to dismiss to when unlock after folded. */ @StageType @@ -1093,10 +1094,11 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onSnappedToDismiss(boolean bottomOrRight) { + setResizingSplits(false /* resizing */); + final boolean mainStageToTop = bottomOrRight ? mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT : mSideStagePosition == SPLIT_POSITION_TOP_OR_LEFT; - if (!ENABLE_SHELL_TRANSITIONS) { exitSplitScreen(mainStageToTop ? mMainStage : mSideStage, EXIT_REASON_DRAG_DIVIDER); return; @@ -1125,6 +1127,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onLayoutSizeChanging(SplitLayout layout) { mSyncQueue.runInSync(t -> { + setResizingSplits(true /* resizing */); updateSurfaceBounds(layout, t); mMainStage.onResizing(getMainStageBounds(), t); mSideStage.onResizing(getSideStageBounds(), t); @@ -1138,6 +1141,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, updateUnfoldBounds(); mSyncQueue.queue(wct); mSyncQueue.runInSync(t -> { + setResizingSplits(false /* resizing */); updateSurfaceBounds(layout, t); mMainStage.onResized(t); mSideStage.onResized(t); @@ -1179,6 +1183,16 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, bottomRightStage.mRootLeash, topLeftStage.mDimLayer, bottomRightStage.mDimLayer); } + void setResizingSplits(boolean resizing) { + if (resizing == mResizingSplits) return; + try { + ActivityTaskManager.getService().setSplitScreenResizing(resizing); + mResizingSplits = resizing; + } catch (RemoteException e) { + Slog.w(TAG, "Error calling setSplitScreenResizing", e); + } + } + @Override public int getSplitItemPosition(WindowContainerToken token) { if (token == null) {