Merge "Reduce flicker for split resizing" into tm-qpr-dev am: 32c9995560

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20351769

Change-Id: I4df4c8d004d5ddf1ab9db83f43153b91b3b0a965
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Tony Huang
2022-11-09 04:17:47 +00:00
committed by Automerger Merge Worker
5 changed files with 48 additions and 10 deletions

View File

@@ -48,6 +48,7 @@ import androidx.annotation.NonNull;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.R;
import com.android.wm.shell.common.ScreenshotUtils;
import com.android.wm.shell.common.SurfaceUtils;
import java.util.function.Consumer;
@@ -74,10 +75,14 @@ public class SplitDecorManager extends WindowlessWindowManager {
private boolean mShown;
private boolean mIsResizing;
private Rect mBounds = new Rect();
private final Rect mBounds = new Rect();
private final Rect mResizingBounds = new Rect();
private final Rect mTempRect = new Rect();
private ValueAnimator mFadeAnimator;
private int mIconSize;
private int mOffsetX;
private int mOffsetY;
public SplitDecorManager(Configuration configuration, IconProvider iconProvider,
SurfaceSession surfaceSession) {
@@ -158,7 +163,7 @@ public class SplitDecorManager extends WindowlessWindowManager {
/** Showing resizing hint. */
public void onResizing(ActivityManager.RunningTaskInfo resizingTask, Rect newBounds,
Rect sideBounds, SurfaceControl.Transaction t) {
Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) {
if (mResizingIconView == null) {
return;
}
@@ -167,6 +172,9 @@ public class SplitDecorManager extends WindowlessWindowManager {
mIsResizing = true;
mBounds.set(newBounds);
}
mResizingBounds.set(newBounds);
mOffsetX = offsetX;
mOffsetY = offsetY;
final boolean show =
newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height();
@@ -221,11 +229,37 @@ public class SplitDecorManager extends WindowlessWindowManager {
/** Stops showing resizing hint. */
public void onResized(SurfaceControl.Transaction t) {
if (!mShown && mIsResizing) {
mTempRect.set(mResizingBounds);
mTempRect.offsetTo(-mOffsetX, -mOffsetY);
final SurfaceControl screenshot = ScreenshotUtils.takeScreenshot(t,
mHostLeash, mTempRect, Integer.MAX_VALUE - 1);
final SurfaceControl.Transaction animT = new SurfaceControl.Transaction();
final ValueAnimator va = ValueAnimator.ofFloat(1, 0);
va.addUpdateListener(valueAnimator -> {
final float progress = (float) valueAnimator.getAnimatedValue();
animT.setAlpha(screenshot, progress);
animT.apply();
});
va.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(@androidx.annotation.NonNull Animator animation) {
animT.remove(screenshot);
animT.apply();
animT.close();
}
});
va.start();
}
if (mResizingIconView == null) {
return;
}
mIsResizing = false;
mOffsetX = 0;
mOffsetY = 0;
if (mFadeAnimator != null && mFadeAnimator.isRunning()) {
if (!mShown) {
// If fade-out animation is running, just add release callback to it.

View File

@@ -448,7 +448,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
*/
void updateDivideBounds(int position) {
updateBounds(position);
mSplitLayoutHandler.onLayoutSizeChanging(this);
mSplitLayoutHandler.onLayoutSizeChanging(this, mSurfaceEffectPolicy.mParallaxOffset.x,
mSurfaceEffectPolicy.mParallaxOffset.y);
}
void setDividePosition(int position, boolean applyLayoutChange) {
@@ -811,7 +812,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
* @see #applySurfaceChanges(SurfaceControl.Transaction, SurfaceControl, SurfaceControl,
* SurfaceControl, SurfaceControl, boolean)
*/
void onLayoutSizeChanging(SplitLayout layout);
void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY);
/**
* Calls when finish resizing the split bounds.

View File

@@ -1633,14 +1633,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
}
@Override
public void onLayoutSizeChanging(SplitLayout layout) {
public void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY) {
final SurfaceControl.Transaction t = mTransactionPool.acquire();
t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
updateSurfaceBounds(layout, t, true /* applyResizingOffset */);
getMainStageBounds(mTempRect1);
getSideStageBounds(mTempRect2);
mMainStage.onResizing(mTempRect1, mTempRect2, t);
mSideStage.onResizing(mTempRect2, mTempRect1, t);
mMainStage.onResizing(mTempRect1, mTempRect2, t, offsetX, offsetY);
mSideStage.onResizing(mTempRect2, mTempRect1, t, offsetX, offsetY);
t.apply();
mTransactionPool.release(t);
}

View File

@@ -288,9 +288,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
}
}
void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) {
void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t, int offsetX,
int offsetY) {
if (mSplitDecorManager != null && mRootTaskInfo != null) {
mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t);
mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t, offsetX,
offsetY);
}
}

View File

@@ -105,7 +105,8 @@ public class SplitLayoutTests extends ShellTestCase {
@Test
public void testUpdateDivideBounds() {
mSplitLayout.updateDivideBounds(anyInt());
verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class));
verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class), anyInt(),
anyInt());
}
@Test