Using Transaction directly instead of building surface params am: fd2c9eb04e

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19933596

Change-Id: I5441961aaae960333dbddd6585568412a88f52a1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Sunny Goyal
2022-09-14 04:28:16 +00:00
committed by Automerger Merge Worker
16 changed files with 345 additions and 173 deletions
@@ -119,6 +119,8 @@ import com.android.quickstep.util.MultiValueUpdateListener;
import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.RemoteAnimationProvider;
import com.android.quickstep.util.StaggeredWorkspaceAnim; import com.android.quickstep.util.StaggeredWorkspaceAnim;
import com.android.quickstep.util.SurfaceTransaction;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.SurfaceTransactionApplier; import com.android.quickstep.util.SurfaceTransactionApplier;
import com.android.quickstep.util.WorkspaceRevealAnim; import com.android.quickstep.util.WorkspaceRevealAnim;
import com.android.quickstep.views.FloatingWidgetView; import com.android.quickstep.views.FloatingWidgetView;
@@ -133,7 +135,6 @@ import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat;
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.RemoteTransitionCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.wm.shell.startingsurface.IStartingWindowListener; import com.android.wm.shell.startingsurface.IStartingWindowListener;
@@ -811,10 +812,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
return; return;
} }
ArrayList<SurfaceParams> params = new ArrayList<>(); SurfaceTransaction transaction = new SurfaceTransaction();
for (int i = appTargets.length - 1; i >= 0; i--) { for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i]; RemoteAnimationTargetCompat target = appTargets[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash); SurfaceProperties builder = transaction.forSurface(target.leash);
if (target.mode == MODE_OPENING) { if (target.mode == MODE_OPENING) {
matrix.setScale(scale, scale); matrix.setScale(scale, scale);
@@ -835,11 +837,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
floatingView.update(mIconAlpha.value, 255, floatingIconBounds, percent, 0f, floatingView.update(mIconAlpha.value, 255, floatingIconBounds, percent, 0f,
mWindowRadius.value * scale, true /* isOpening */); mWindowRadius.value * scale, true /* isOpening */);
builder.withMatrix(matrix) builder.setMatrix(matrix)
.withWindowCrop(crop) .setWindowCrop(crop)
.withAlpha(1f - mIconAlpha.value) .setAlpha(1f - mIconAlpha.value)
.withCornerRadius(mWindowRadius.value) .setCornerRadius(mWindowRadius.value)
.withShadowRadius(mShadowRadius.value); .setShadowRadius(mShadowRadius.value);
} else if (target.mode == MODE_CLOSING) { } else if (target.mode == MODE_CLOSING) {
if (target.localBounds != null) { if (target.localBounds != null) {
final Rect localBounds = target.localBounds; final Rect localBounds = target.localBounds;
@@ -859,29 +861,26 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
tmpPos.y = tmp; tmpPos.y = tmp;
} }
matrix.setTranslate(tmpPos.x, tmpPos.y); matrix.setTranslate(tmpPos.x, tmpPos.y);
builder.withMatrix(matrix) builder.setMatrix(matrix)
.withWindowCrop(crop) .setWindowCrop(crop)
.withAlpha(1f); .setAlpha(1f);
} }
params.add(builder.build());
} }
if (navBarTarget != null) { if (navBarTarget != null) {
final SurfaceParams.Builder navBuilder = SurfaceProperties navBuilder =
new SurfaceParams.Builder(navBarTarget.leash); transaction.forSurface(navBarTarget.leash);
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) { if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
matrix.setScale(scale, scale); matrix.setScale(scale, scale);
matrix.postTranslate(windowTransX0, windowTransY0); matrix.postTranslate(windowTransX0, windowTransY0);
navBuilder.withMatrix(matrix) navBuilder.setMatrix(matrix)
.withWindowCrop(crop) .setWindowCrop(crop)
.withAlpha(mNavFadeIn.value); .setAlpha(mNavFadeIn.value);
} else { } else {
navBuilder.withAlpha(mNavFadeOut.value); navBuilder.setAlpha(mNavFadeOut.value);
} }
params.add(navBuilder.build());
} }
surfaceApplier.scheduleApply(transaction);
surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
} }
}; };
appAnimator.addUpdateListener(listener); appAnimator.addUpdateListener(listener);
@@ -997,37 +996,33 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
matrix.postScale(mAppWindowScale, mAppWindowScale, widgetBackgroundBounds.left, matrix.postScale(mAppWindowScale, mAppWindowScale, widgetBackgroundBounds.left,
widgetBackgroundBounds.top); widgetBackgroundBounds.top);
ArrayList<SurfaceParams> params = new ArrayList<>(); SurfaceTransaction transaction = new SurfaceTransaction();
float floatingViewAlpha = appTargetsAreTranslucent ? 1 - mPreviewAlpha.value : 1; float floatingViewAlpha = appTargetsAreTranslucent ? 1 - mPreviewAlpha.value : 1;
for (int i = appTargets.length - 1; i >= 0; i--) { for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i]; RemoteAnimationTargetCompat target = appTargets[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash); SurfaceProperties builder = transaction.forSurface(target.leash);
if (target.mode == MODE_OPENING) { if (target.mode == MODE_OPENING) {
floatingView.update(widgetBackgroundBounds, floatingViewAlpha, floatingView.update(widgetBackgroundBounds, floatingViewAlpha,
mWidgetForegroundAlpha.value, mWidgetFallbackBackgroundAlpha.value, mWidgetForegroundAlpha.value, mWidgetFallbackBackgroundAlpha.value,
mCornerRadiusProgress.value); mCornerRadiusProgress.value);
builder.withMatrix(matrix) builder.setMatrix(matrix)
.withWindowCrop(appWindowCrop) .setWindowCrop(appWindowCrop)
.withAlpha(mPreviewAlpha.value) .setAlpha(mPreviewAlpha.value)
.withCornerRadius(mWindowRadius.value / mAppWindowScale); .setCornerRadius(mWindowRadius.value / mAppWindowScale);
} }
params.add(builder.build());
} }
if (navBarTarget != null) { if (navBarTarget != null) {
final SurfaceParams.Builder navBuilder = SurfaceProperties navBuilder = transaction.forSurface(navBarTarget.leash);
new SurfaceParams.Builder(navBarTarget.leash);
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) { if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
navBuilder.withMatrix(matrix) navBuilder.setMatrix(matrix)
.withWindowCrop(appWindowCrop) .setWindowCrop(appWindowCrop)
.withAlpha(mNavFadeIn.value); .setAlpha(mNavFadeIn.value);
} else { } else {
navBuilder.withAlpha(mNavFadeOut.value); navBuilder.setAlpha(mNavFadeOut.value);
} }
params.add(navBuilder.build());
} }
surfaceApplier.scheduleApply(transaction);
surfaceApplier.scheduleApply(params.toArray(new SurfaceParams[params.size()]));
} }
}); });
@@ -1222,16 +1217,15 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
unlockAnimator.addListener(new AnimatorListenerAdapter() { unlockAnimator.addListener(new AnimatorListenerAdapter() {
@Override @Override
public void onAnimationStart(Animator animation) { public void onAnimationStart(Animator animation) {
SurfaceParams[] params = new SurfaceParams[appTargets.length]; SurfaceTransaction transaction = new SurfaceTransaction();
for (int i = appTargets.length - 1; i >= 0; i--) { for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i]; RemoteAnimationTargetCompat target = appTargets[i];
params[i] = new SurfaceParams.Builder(target.leash) transaction.forSurface(target.leash)
.withAlpha(1f) .setAlpha(1f)
.withWindowCrop(target.screenSpaceBounds) .setWindowCrop(target.screenSpaceBounds)
.withCornerRadius(cornerRadius) .setCornerRadius(cornerRadius);
.build();
} }
surfaceApplier.scheduleApply(params); surfaceApplier.scheduleApply(transaction);
} }
}); });
return unlockAnimator; return unlockAnimator;
@@ -1449,10 +1443,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
@Override @Override
public void onUpdate(float percent, boolean initOnly) { public void onUpdate(float percent, boolean initOnly) {
SurfaceParams[] params = new SurfaceParams[appTargets.length]; SurfaceTransaction transaction = new SurfaceTransaction();
for (int i = appTargets.length - 1; i >= 0; i--) { for (int i = appTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = appTargets[i]; RemoteAnimationTargetCompat target = appTargets[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash); SurfaceProperties builder = transaction.forSurface(target.leash);
if (target.localBounds != null) { if (target.localBounds != null) {
tmpPos.set(target.localBounds.left, target.localBounds.top); tmpPos.set(target.localBounds.left, target.localBounds.top);
@@ -1474,20 +1468,19 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
tmpRect.centerY()); tmpRect.centerY());
matrix.postTranslate(0, mDy.value); matrix.postTranslate(0, mDy.value);
matrix.postTranslate(tmpPos.x, tmpPos.y); matrix.postTranslate(tmpPos.x, tmpPos.y);
builder.withMatrix(matrix) builder.setMatrix(matrix)
.withWindowCrop(crop) .setWindowCrop(crop)
.withAlpha(mAlpha.value) .setAlpha(mAlpha.value)
.withCornerRadius(windowCornerRadius) .setCornerRadius(windowCornerRadius)
.withShadowRadius(mShadowRadius.value); .setShadowRadius(mShadowRadius.value);
} else if (target.mode == MODE_OPENING) { } else if (target.mode == MODE_OPENING) {
matrix.setTranslate(tmpPos.x, tmpPos.y); matrix.setTranslate(tmpPos.x, tmpPos.y);
builder.withMatrix(matrix) builder.setMatrix(matrix)
.withWindowCrop(crop) .setWindowCrop(crop)
.withAlpha(1f); .setAlpha(1f);
} }
params[i] = builder.build();
} }
surfaceApplier.scheduleApply(params); surfaceApplier.scheduleApply(transaction);
} }
}); });
@@ -1857,10 +1850,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
@Override @Override
public void onUpdate(RectF currentRectF, float progress) { public void onUpdate(RectF currentRectF, float progress) {
SurfaceParams[] params = new SurfaceParams[mAppTargets.length]; SurfaceTransaction transaction = new SurfaceTransaction();
for (int i = mAppTargets.length - 1; i >= 0; i--) { for (int i = mAppTargets.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = mAppTargets[i]; RemoteAnimationTargetCompat target = mAppTargets[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(target.leash); SurfaceProperties builder = transaction.forSurface(target.leash);
if (target.localBounds != null) { if (target.localBounds != null) {
mTmpPos.set(target.localBounds.left, target.localBounds.top); mTmpPos.set(target.localBounds.left, target.localBounds.top);
@@ -1895,18 +1888,17 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
mMatrix.setScale(scale, scale); mMatrix.setScale(scale, scale);
mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top); mMatrix.postTranslate(mCurrentRect.left, mCurrentRect.top);
builder.withMatrix(mMatrix) builder.setMatrix(mMatrix)
.withWindowCrop(mTmpRect) .setWindowCrop(mTmpRect)
.withAlpha(getWindowAlpha(progress)) .setAlpha(getWindowAlpha(progress))
.withCornerRadius(getCornerRadius(progress) / scale); .setCornerRadius(getCornerRadius(progress) / scale);
} else if (target.mode == MODE_OPENING) { } else if (target.mode == MODE_OPENING) {
mMatrix.setTranslate(mTmpPos.x, mTmpPos.y); mMatrix.setTranslate(mTmpPos.x, mTmpPos.y);
builder.withMatrix(mMatrix) builder.setMatrix(mMatrix)
.withAlpha(1f); .setAlpha(1f);
} }
params[i] = builder.build();
} }
mSurfaceApplier.scheduleApply(params); mSurfaceApplier.scheduleApply(transaction);
} }
protected float getWindowAlpha(float progress) { protected float getWindowAlpha(float progress) {
@@ -65,12 +65,12 @@ import com.android.launcher3.util.DisplayController;
import com.android.quickstep.fallback.FallbackRecentsView; import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsState; import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy; import com.android.quickstep.util.TransformParams.BuilderProxy;
import com.android.systemui.shared.recents.model.Task.TaskKey; import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
@@ -125,18 +125,18 @@ public class FallbackSwipeHandler extends
} }
} }
private void updateHomeActivityTransformDuringSwipeUp(SurfaceParams.Builder builder, private void updateHomeActivityTransformDuringSwipeUp(SurfaceProperties builder,
RemoteAnimationTargetCompat app, TransformParams params) { RemoteAnimationTargetCompat app, TransformParams params) {
setHomeScaleAndAlpha(builder, app, mCurrentShift.value, setHomeScaleAndAlpha(builder, app, mCurrentShift.value,
Utilities.boundToRange(1 - mCurrentShift.value, 0, 1)); Utilities.boundToRange(1 - mCurrentShift.value, 0, 1));
} }
private void setHomeScaleAndAlpha(SurfaceParams.Builder builder, private void setHomeScaleAndAlpha(SurfaceProperties builder,
RemoteAnimationTargetCompat app, float verticalShift, float alpha) { RemoteAnimationTargetCompat app, float verticalShift, float alpha) {
float scale = Utilities.mapRange(verticalShift, 1, mMaxLauncherScale); float scale = Utilities.mapRange(verticalShift, 1, mMaxLauncherScale);
mTmpMatrix.setScale(scale, scale, mTmpMatrix.setScale(scale, scale,
app.localBounds.exactCenterX(), app.localBounds.exactCenterY()); app.localBounds.exactCenterX(), app.localBounds.exactCenterY());
builder.withMatrix(mTmpMatrix).withAlpha(alpha); builder.setMatrix(mTmpMatrix).setAlpha(alpha);
} }
@Override @Override
@@ -279,12 +279,12 @@ public class FallbackSwipeHandler extends
return mTargetRect; return mTargetRect;
} }
private void updateRecentsActivityTransformDuringHomeAnim(SurfaceParams.Builder builder, private void updateRecentsActivityTransformDuringHomeAnim(SurfaceProperties builder,
RemoteAnimationTargetCompat app, TransformParams params) { RemoteAnimationTargetCompat app, TransformParams params) {
builder.withAlpha(mRecentsAlpha.value); builder.setAlpha(mRecentsAlpha.value);
} }
private void updateHomeActivityTransformDuringHomeAnim(SurfaceParams.Builder builder, private void updateHomeActivityTransformDuringHomeAnim(SurfaceProperties builder,
RemoteAnimationTargetCompat app, TransformParams params) { RemoteAnimationTargetCompat app, TransformParams params) {
setHomeScaleAndAlpha(builder, app, mVerticalShiftForScale.value, mHomeAlpha.value); setHomeScaleAndAlpha(builder, app, mVerticalShiftForScale.value, mHomeAlpha.value);
} }
@@ -46,7 +46,6 @@ import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
/** /**
* Controls the animation of swiping back and returning to launcher. * Controls the animation of swiping back and returning to launcher.
@@ -242,20 +241,17 @@ public class LauncherBackAnimationController {
/** Transform the target window to match the target rect. */ /** Transform the target window to match the target rect. */
private void applyTransform(RectF targetRect, float cornerRadius) { private void applyTransform(RectF targetRect, float cornerRadius) {
SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder builder =
new SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder(mBackTarget.leash);
final float scale = targetRect.width() / mStartRect.width(); final float scale = targetRect.width() / mStartRect.width();
mTransformMatrix.reset(); mTransformMatrix.reset();
mTransformMatrix.setScale(scale, scale); mTransformMatrix.setScale(scale, scale);
mTransformMatrix.postTranslate(targetRect.left, targetRect.top); mTransformMatrix.postTranslate(targetRect.left, targetRect.top);
builder.withMatrix(mTransformMatrix)
.withWindowCrop(mStartRect)
.withCornerRadius(cornerRadius);
SyncRtSurfaceTransactionApplierCompat.SurfaceParams surfaceParams = builder.build();
if (surfaceParams.surface.isValid()) { if (mBackTarget.leash.isValid()) {
surfaceParams.applyTo(mTransaction); mTransaction.setMatrix(mBackTarget.leash, mTransformMatrix, new float[9]);
mTransaction.setWindowCrop(mBackTarget.leash, mStartRect);
mTransaction.setCornerRadius(mBackTarget.leash, cornerRadius);
} }
mTransaction.apply(); mTransaction.apply();
} }
@@ -37,11 +37,11 @@ import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle; import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
import com.android.quickstep.util.AnimatorControllerWithResistance; import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy; import com.android.quickstep.util.TransformParams.BuilderProxy;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -335,11 +335,11 @@ public abstract class SwipeUpAnimationLogic implements
} }
@Override @Override
public void onBuildTargetParams( public void onBuildTargetParams(SurfaceProperties builder, RemoteAnimationTargetCompat app,
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) { TransformParams params) {
builder.withMatrix(mMatrix) builder.setMatrix(mMatrix)
.withWindowCrop(mCropRect) .setWindowCrop(mCropRect)
.withCornerRadius(params.getCornerRadius()); .setCornerRadius(params.getCornerRadius());
} }
@Override @Override
@@ -72,6 +72,8 @@ import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController;
import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle; import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle;
import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.MultiValueUpdateListener;
import com.android.quickstep.util.SurfaceTransaction;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.SurfaceTransactionApplier; import com.android.quickstep.util.SurfaceTransactionApplier;
import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
@@ -82,7 +84,6 @@ import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -252,21 +253,24 @@ public final class TaskViewUtils {
@Override @Override
public void onUpdate(float percent, boolean initOnly) { public void onUpdate(float percent, boolean initOnly) {
final SurfaceParams.Builder navBuilder =
new SurfaceParams.Builder(navBarTarget.leash);
// TODO Do we need to operate over multiple TVSs for the navbar leash? // TODO Do we need to operate over multiple TVSs for the navbar leash?
for (RemoteTargetHandle handle : remoteTargetHandles) { for (RemoteTargetHandle handle : remoteTargetHandles) {
SurfaceTransaction transaction = new SurfaceTransaction();
SurfaceProperties navBuilder =
transaction.forSurface(navBarTarget.leash);
if (mNavFadeIn.value > mNavFadeIn.getStartValue()) { if (mNavFadeIn.value > mNavFadeIn.getStartValue()) {
TaskViewSimulator taskViewSimulator = handle.getTaskViewSimulator(); TaskViewSimulator taskViewSimulator = handle.getTaskViewSimulator();
taskViewSimulator.getCurrentCropRect().round(cropRect); taskViewSimulator.getCurrentCropRect().round(cropRect);
navBuilder.withMatrix(taskViewSimulator.getCurrentMatrix()) navBuilder.setMatrix(taskViewSimulator.getCurrentMatrix())
.withWindowCrop(cropRect) .setWindowCrop(cropRect)
.withAlpha(mNavFadeIn.value); .setAlpha(mNavFadeIn.value);
} else { } else {
navBuilder.withAlpha(mNavFadeOut.value); navBuilder.setAlpha(mNavFadeOut.value);
} }
handle.getTransformParams().applySurfaceParams(navBuilder.build()); handle.getTransformParams().applySurfaceParams(transaction);
} }
} }
}); });
@@ -474,7 +478,7 @@ public final class TaskViewUtils {
* If {@param launchingTaskView} is not null, then this will play the tasks launch animation * If {@param launchingTaskView} is not null, then this will play the tasks launch animation
* from the position of the GroupedTaskView (when user taps on the TaskView to start it). * from the position of the GroupedTaskView (when user taps on the TaskView to start it).
* Technically this case should be taken care of by * Technically this case should be taken care of by
* {@link #composeRecentsSplitLaunchAnimatorLegacy()} below, but the way we launch tasks whether * {@link #composeRecentsSplitLaunchAnimatorLegacy} below, but the way we launch tasks whether
* it's a single task or multiple tasks results in different entry-points. * it's a single task or multiple tasks results in different entry-points.
* *
* If it is null, then it will simply fade in the starting apps and fade out launcher (for the * If it is null, then it will simply fade in the starting apps and fade out launcher (for the
@@ -53,13 +53,13 @@ import com.android.quickstep.RecentsAnimationController;
import com.android.quickstep.RecentsAnimationDeviceState; import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.RecentsAnimationTargets; import com.android.quickstep.RecentsAnimationTargets;
import com.android.quickstep.TaskAnimationManager; import com.android.quickstep.TaskAnimationManager;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy; import com.android.quickstep.util.TransformParams.BuilderProxy;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.InputMonitorCompat;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
import java.util.HashMap; import java.util.HashMap;
@@ -290,9 +290,9 @@ public class DeviceLockedInputConsumer implements InputConsumer,
@Override @Override
public void onBuildTargetParams( public void onBuildTargetParams(
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) { SurfaceProperties builder, RemoteAnimationTargetCompat app, TransformParams params) {
mMatrix.setTranslate(0, mProgress.value * mMaxTranslationY); mMatrix.setTranslate(0, mProgress.value * mMaxTranslationY);
builder.withMatrix(mMatrix); builder.setMatrix(mMatrix);
} }
@Override @Override
@@ -33,7 +33,6 @@ import android.graphics.PointF;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.os.Build; import android.os.Build;
import android.view.SurfaceControl;
import android.view.View; import android.view.View;
import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider;
@@ -53,9 +52,11 @@ import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.RemoteTargetGluer; import com.android.quickstep.RemoteTargetGluer;
import com.android.quickstep.SwipeUpAnimationLogic; import com.android.quickstep.SwipeUpAnimationLogic;
import com.android.quickstep.SwipeUpAnimationLogic.RunningWindowAnim; import com.android.quickstep.SwipeUpAnimationLogic.RunningWindowAnim;
import com.android.quickstep.util.RecordingSurfaceTransaction;
import com.android.quickstep.util.RecordingSurfaceTransaction.MockProperties;
import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction;
import com.android.quickstep.util.TransformParams; import com.android.quickstep.util.TransformParams;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
@TargetApi(Build.VERSION_CODES.R) @TargetApi(Build.VERSION_CODES.R)
abstract class SwipeUpGestureTutorialController extends TutorialController { abstract class SwipeUpGestureTutorialController extends TutorialController {
@@ -415,21 +416,23 @@ abstract class SwipeUpGestureTutorialController extends TutorialController {
private class FakeTransformParams extends TransformParams { private class FakeTransformParams extends TransformParams {
@Override @Override
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) { public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
SurfaceParams.Builder builder = new SurfaceParams.Builder((SurfaceControl) null); RecordingSurfaceTransaction transaction = new RecordingSurfaceTransaction();
proxy.onBuildTargetParams(builder, null, this); proxy.onBuildTargetParams(transaction.mockProperties, null, this);
return new SurfaceParams[] {builder.build()}; return transaction;
} }
@Override @Override
public void applySurfaceParams(SurfaceParams[] params) { public void applySurfaceParams(SurfaceTransaction params) {
SurfaceParams p = params[0]; if (params instanceof RecordingSurfaceTransaction) {
mFakeTaskView.setAnimationMatrix(p.matrix); MockProperties p = ((RecordingSurfaceTransaction) params).mockProperties;
mFakePreviousTaskView.setAnimationMatrix(p.matrix); mFakeTaskView.setAnimationMatrix(p.matrix);
mFakeTaskViewRect.set(p.windowCrop); mFakePreviousTaskView.setAnimationMatrix(p.matrix);
mFakeTaskViewRadius = p.cornerRadius; mFakeTaskViewRect.set(p.windowCrop);
mFakeTaskView.invalidateOutline(); mFakeTaskViewRadius = p.cornerRadius;
mFakePreviousTaskView.invalidateOutline(); mFakeTaskView.invalidateOutline();
mFakePreviousTaskView.invalidateOutline();
}
} }
} }
} }
@@ -0,0 +1,81 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import android.graphics.Matrix;
import android.graphics.Rect;
/**
* Extension for {@link SurfaceTransaction} which records the commands for mocking
*/
public class RecordingSurfaceTransaction extends SurfaceTransaction {
/**
* A mock builder which can be used for recording values
*/
public final MockProperties mockProperties = new MockProperties();
/**
* Extension of {@link SurfaceProperties} which just stores all the values locally
*/
public class MockProperties extends SurfaceProperties {
public float alpha = -1;
public Matrix matrix = null;
public Rect windowCrop = null;
public float cornerRadius = 0;
public float shadowRadius = 0;
MockProperties() {
super(null);
}
@Override
public SurfaceProperties setAlpha(float alpha) {
this.alpha = alpha;
return this;
}
@Override
public SurfaceProperties setMatrix(Matrix matrix) {
this.matrix = matrix;
return this;
}
@Override
public SurfaceProperties setWindowCrop(Rect windowCrop) {
this.windowCrop = windowCrop;
return this;
}
@Override
public SurfaceProperties setLayer(int relativeLayer) {
return this;
}
@Override
public SurfaceProperties setCornerRadius(float radius) {
this.cornerRadius = radius;
return this;
}
@Override
public SurfaceProperties setShadowRadius(float radius) {
this.shadowRadius = radius;
return this;
}
}
}
@@ -19,10 +19,10 @@ import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MOD
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener; import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.view.SurfaceControl.Transaction;
import com.android.quickstep.RemoteAnimationTargets; import com.android.quickstep.RemoteAnimationTargets;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.TransactionCompat;
/** /**
* Animation listener which fades out the closing targets * Animation listener which fades out the closing targets
@@ -40,7 +40,7 @@ public class RemoteFadeOutAnimationListener implements AnimatorUpdateListener {
@Override @Override
public void onAnimationUpdate(ValueAnimator valueAnimator) { public void onAnimationUpdate(ValueAnimator valueAnimator) {
TransactionCompat t = new TransactionCompat(); Transaction t = new Transaction();
if (mFirstFrame) { if (mFirstFrame) {
for (RemoteAnimationTargetCompat target : mTarget.unfilteredApps) { for (RemoteAnimationTargetCompat target : mTarget.unfilteredApps) {
t.show(target.leash); t.show(target.leash);
@@ -0,0 +1,110 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.quickstep.util;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
/**
* Helper class for building a {@link Transaction}.
*/
public class SurfaceTransaction {
private final Transaction mTransaction = new Transaction();
private final float[] mTmpValues = new float[9];
/**
* Creates a new builder for the provided surface
*/
public SurfaceProperties forSurface(SurfaceControl surface) {
return new SurfaceProperties(surface);
}
/**
* Returns the final transaction
*/
public Transaction getTransaction() {
return mTransaction;
}
/**
* Utility class to update surface params in a transaction
*/
public class SurfaceProperties {
private final SurfaceControl mSurface;
SurfaceProperties(SurfaceControl surface) {
mSurface = surface;
}
/**
* @param alpha The alpha value to apply to the surface.
* @return this Builder
*/
public SurfaceProperties setAlpha(float alpha) {
mTransaction.setAlpha(mSurface, alpha);
return this;
}
/**
* @param matrix The matrix to apply to the surface.
* @return this Builder
*/
public SurfaceProperties setMatrix(Matrix matrix) {
mTransaction.setMatrix(mSurface, matrix, mTmpValues);
return this;
}
/**
* @param windowCrop The window crop to apply to the surface.
* @return this Builder
*/
public SurfaceProperties setWindowCrop(Rect windowCrop) {
mTransaction.setWindowCrop(mSurface, windowCrop);
return this;
}
/**
* @param relativeLayer The relative layer.
* @return this Builder
*/
public SurfaceProperties setLayer(int relativeLayer) {
mTransaction.setLayer(mSurface, relativeLayer);
return this;
}
/**
* @param radius the Radius for rounded corners to apply to the surface.
* @return this Builder
*/
public SurfaceProperties setCornerRadius(float radius) {
mTransaction.setCornerRadius(mSurface, radius);
return this;
}
/**
* @param radius the Radius for the shadows to apply to the surface.
* @return this Builder
*/
public SurfaceProperties setShadowRadius(float radius) {
mTransaction.setShadowRadius(mSurface, radius);
return this;
}
}
}
@@ -25,7 +25,6 @@ import android.view.View;
import android.view.ViewRootImpl; import android.view.ViewRootImpl;
import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck; import com.android.quickstep.RemoteAnimationTargets.ReleaseCheck;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -70,18 +69,12 @@ public class SurfaceTransactionApplier extends ReleaseCheck {
* @param params The surface parameters to apply. DO NOT MODIFY the list after passing into * @param params The surface parameters to apply. DO NOT MODIFY the list after passing into
* this method to avoid synchronization issues. * this method to avoid synchronization issues.
*/ */
public void scheduleApply(final SurfaceParams... params) { public void scheduleApply(SurfaceTransaction params) {
View view = mTargetViewRootImpl.getView(); View view = mTargetViewRootImpl.getView();
if (view == null) { if (view == null) {
return; return;
} }
Transaction t = new Transaction(); Transaction t = params.getTransaction();
for (int i = params.length - 1; i >= 0; i--) {
SurfaceParams surfaceParams = params[i];
if (surfaceParams.surface.isValid()) {
surfaceParams.applyTo(t);
}
}
mLastSequenceNumber++; mLastSequenceNumber++;
final int toApplySeqNo = mLastSequenceNumber; final int toApplySeqNo = mLastSequenceNumber;
@@ -102,7 +95,7 @@ public class SurfaceTransactionApplier extends ReleaseCheck {
} }
/** /**
* Creates an instance of SyncRtSurfaceTransactionApplier, deferring until the target view is * Creates an instance of SurfaceTransactionApplier, deferring until the target view is
* attached if necessary. * attached if necessary.
*/ */
public static void create( public static void create(
@@ -46,11 +46,11 @@ import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.AnimatedFloat; import com.android.quickstep.AnimatedFloat;
import com.android.quickstep.BaseActivityInterface; import com.android.quickstep.BaseActivityInterface;
import com.android.quickstep.TaskAnimationManager; import com.android.quickstep.TaskAnimationManager;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper; import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
import com.android.quickstep.views.TaskView.FullscreenDrawParams; import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams.Builder;
/** /**
* A utility class which emulates the layout behavior of TaskView and RecentsView * A utility class which emulates the layout behavior of TaskView and RecentsView
@@ -386,10 +386,10 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
@Override @Override
public void onBuildTargetParams( public void onBuildTargetParams(
Builder builder, RemoteAnimationTargetCompat app, TransformParams params) { SurfaceProperties builder, RemoteAnimationTargetCompat app, TransformParams params) {
builder.withMatrix(mMatrix) builder.setMatrix(mMatrix)
.withWindowCrop(mTmpCropRect) .setWindowCrop(mTmpCropRect)
.withCornerRadius(getCurrentCornerRadius()); .setCornerRadius(getCurrentCornerRadius());
// If mDrawsBelowRecents is unset, no reordering will be enforced. // If mDrawsBelowRecents is unset, no reordering will be enforced.
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mDrawsBelowRecents != null) { if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mDrawsBelowRecents != null) {
@@ -398,7 +398,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
// conflict with layers that WM core positions (ie. the input consumers). For shell // conflict with layers that WM core positions (ie. the input consumers). For shell
// transitions, the animation leashes are reparented to an animation container so we // transitions, the animation leashes are reparented to an animation container so we
// can bump layers as needed. // can bump layers as needed.
builder.withLayer(mDrawsBelowRecents builder.setLayer(mDrawsBelowRecents
? Integer.MIN_VALUE + 1 ? Integer.MIN_VALUE + 1
: ENABLE_SHELL_TRANSITIONS ? Integer.MAX_VALUE : 0); : ENABLE_SHELL_TRANSITIONS ? Integer.MAX_VALUE : 0);
} }
@@ -21,10 +21,8 @@ import android.view.SurfaceControl;
import com.android.launcher3.Utilities; import com.android.launcher3.Utilities;
import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.Interpolators;
import com.android.quickstep.RemoteAnimationTargets; import com.android.quickstep.RemoteAnimationTargets;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import com.android.systemui.shared.system.TransactionCompat;
public class TransformParams { public class TransformParams {
@@ -113,8 +111,7 @@ public class TransformParams {
* Sets the SyncRtSurfaceTransactionApplierCompat that will apply the SurfaceParams that * Sets the SyncRtSurfaceTransactionApplierCompat that will apply the SurfaceParams that
* are computed based on these TransformParams. * are computed based on these TransformParams.
*/ */
public TransformParams setSyncTransactionApplier( public TransformParams setSyncTransactionApplier(SurfaceTransactionApplier applier) {
SurfaceTransactionApplier applier) {
mSyncTransactionApplier = applier; mSyncTransactionApplier = applier;
return this; return this;
} }
@@ -137,16 +134,14 @@ public class TransformParams {
return this; return this;
} }
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) { public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
RemoteAnimationTargets targets = mTargetSet; RemoteAnimationTargets targets = mTargetSet;
final int appLength = targets.unfilteredApps.length; SurfaceTransaction transaction = new SurfaceTransaction();
final int wallpaperLength = targets.wallpapers != null ? targets.wallpapers.length : 0;
SurfaceParams[] surfaceParams = new SurfaceParams[appLength + wallpaperLength];
mRecentsSurface = getRecentsSurface(targets); mRecentsSurface = getRecentsSurface(targets);
for (int i = 0; i < appLength; i++) { for (int i = 0; i < targets.unfilteredApps.length; i++) {
RemoteAnimationTargetCompat app = targets.unfilteredApps[i]; RemoteAnimationTargetCompat app = targets.unfilteredApps[i];
SurfaceParams.Builder builder = new SurfaceParams.Builder(app.leash); SurfaceProperties builder = transaction.forSurface(app.leash);
if (app.mode == targets.targetMode) { if (app.mode == targets.targetMode) {
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
@@ -156,9 +151,9 @@ public class TransformParams {
if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_ASSISTANT if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_ASSISTANT
&& app.isNotInRecents) { && app.isNotInRecents) {
float progress = Utilities.boundToRange(getProgress(), 0, 1); float progress = Utilities.boundToRange(getProgress(), 0, 1);
builder.withAlpha(1 - Interpolators.DEACCEL_2_5.getInterpolation(progress)); builder.setAlpha(1 - Interpolators.DEACCEL_2_5.getInterpolation(progress));
} else { } else {
builder.withAlpha(getTargetAlpha()); builder.setAlpha(getTargetAlpha());
} }
proxy.onBuildTargetParams(builder, app, this); proxy.onBuildTargetParams(builder, app, this);
@@ -166,15 +161,15 @@ public class TransformParams {
} else { } else {
mBaseBuilderProxy.onBuildTargetParams(builder, app, this); mBaseBuilderProxy.onBuildTargetParams(builder, app, this);
} }
surfaceParams[i] = builder.build();
} }
// always put wallpaper layer to bottom. // always put wallpaper layer to bottom.
final int wallpaperLength = targets.wallpapers != null ? targets.wallpapers.length : 0;
for (int i = 0; i < wallpaperLength; i++) { for (int i = 0; i < wallpaperLength; i++) {
RemoteAnimationTargetCompat wallpaper = targets.wallpapers[i]; RemoteAnimationTargetCompat wallpaper = targets.wallpapers[i];
surfaceParams[appLength + i] = new SurfaceParams.Builder(wallpaper.leash) transaction.forSurface(wallpaper.leash).setLayer(Integer.MIN_VALUE);
.withLayer(Integer.MIN_VALUE).build();
} }
return surfaceParams; return transaction;
} }
private static SurfaceControl getRecentsSurface(RemoteAnimationTargets targets) { private static SurfaceControl getRecentsSurface(RemoteAnimationTargets targets) {
@@ -213,15 +208,11 @@ public class TransformParams {
return mTargetSet; return mTargetSet;
} }
public void applySurfaceParams(SurfaceParams... params) { public void applySurfaceParams(SurfaceTransaction builder) {
if (mSyncTransactionApplier != null) { if (mSyncTransactionApplier != null) {
mSyncTransactionApplier.scheduleApply(params); mSyncTransactionApplier.scheduleApply(builder);
} else { } else {
TransactionCompat t = new TransactionCompat(); builder.getTransaction().apply();
for (SurfaceParams param : params) {
SyncRtSurfaceTransactionApplierCompat.applyParams(t, param);
}
t.apply();
} }
} }
@@ -229,9 +220,9 @@ public class TransformParams {
public interface BuilderProxy { public interface BuilderProxy {
BuilderProxy NO_OP = (builder, app, params) -> { }; BuilderProxy NO_OP = (builder, app, params) -> { };
BuilderProxy ALWAYS_VISIBLE = (builder, app, params) ->builder.withAlpha(1); BuilderProxy ALWAYS_VISIBLE = (builder, app, params) -> builder.setAlpha(1);
void onBuildTargetParams(SurfaceParams.Builder builder, void onBuildTargetParams(SurfaceProperties builder,
RemoteAnimationTargetCompat app, TransformParams params); RemoteAnimationTargetCompat app, TransformParams params);
} }
} }
@@ -172,6 +172,7 @@ import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RecentsOrientedState; import com.android.quickstep.util.RecentsOrientedState;
import com.android.quickstep.util.SplitScreenBounds; import com.android.quickstep.util.SplitScreenBounds;
import com.android.quickstep.util.SplitSelectStateController; import com.android.quickstep.util.SplitSelectStateController;
import com.android.quickstep.util.SurfaceTransaction;
import com.android.quickstep.util.SurfaceTransactionApplier; import com.android.quickstep.util.SurfaceTransactionApplier;
import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.TaskVisualsChangeListener; import com.android.quickstep.util.TaskVisualsChangeListener;
@@ -184,7 +185,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.wm.shell.pip.IPipAnimationListener; import com.android.wm.shell.pip.IPipAnimationListener;
@@ -1064,14 +1064,15 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
appAnimator.setInterpolator(ACCEL_DEACCEL); appAnimator.setInterpolator(ACCEL_DEACCEL);
appAnimator.addUpdateListener(valueAnimator -> { appAnimator.addUpdateListener(valueAnimator -> {
float percent = valueAnimator.getAnimatedFraction(); float percent = valueAnimator.getAnimatedFraction();
SurfaceParams.Builder builder = new SurfaceParams.Builder( SurfaceTransaction transaction = new SurfaceTransaction();
apps[apps.length - 1].leash);
Matrix matrix = new Matrix(); Matrix matrix = new Matrix();
matrix.postScale(percent, percent); matrix.postScale(percent, percent);
matrix.postTranslate(mActivity.getDeviceProfile().widthPx * (1 - percent) / 2, matrix.postTranslate(mActivity.getDeviceProfile().widthPx * (1 - percent) / 2,
mActivity.getDeviceProfile().heightPx * (1 - percent) / 2); mActivity.getDeviceProfile().heightPx * (1 - percent) / 2);
builder.withAlpha(percent).withMatrix(matrix); transaction.forSurface(apps[apps.length - 1].leash)
surfaceApplier.scheduleApply(builder.build()); .setAlpha(percent)
.setMatrix(matrix);
surfaceApplier.scheduleApply(transaction);
}); });
anim.play(appAnimator); anim.play(appAnimator);
anim.addListener(new AnimatorListenerAdapter() { anim.addListener(new AnimatorListenerAdapter() {
@@ -36,7 +36,6 @@ import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName; import android.content.ComponentName;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -111,7 +110,6 @@ public final class WidgetsPredicationUpdateTaskTest {
doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle())); doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle()));
doAnswer(i -> { doAnswer(i -> {
String pkg = i.getArgument(0); String pkg = i.getArgument(0);
Log.e("Hello", "Getting v " + pkg);
return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream() return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream()
.filter(a -> pkg.equals(a.provider.getPackageName())) .filter(a -> pkg.equals(a.provider.getPackageName()))
.collect(Collectors.toList()); .collect(Collectors.toList());
@@ -24,7 +24,6 @@ import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.view.Surface; import android.view.Surface;
import android.view.SurfaceControl;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -42,8 +41,8 @@ import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy; import com.android.launcher3.util.window.WindowManagerProxy;
import com.android.quickstep.FallbackActivityInterface; import com.android.quickstep.FallbackActivityInterface;
import com.android.quickstep.SystemUiProxy; import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.RecordingSurfaceTransaction.MockProperties;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
import org.hamcrest.Description; import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher; import org.hamcrest.TypeSafeMatcher;
@@ -207,17 +206,21 @@ public class TaskViewSimulatorTest {
} }
@Override @Override
public SurfaceParams[] createSurfaceParams(BuilderProxy proxy) { public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
SurfaceParams.Builder builder = new SurfaceParams.Builder((SurfaceControl) null); RecordingSurfaceTransaction transaction = new RecordingSurfaceTransaction();
proxy.onBuildTargetParams(builder, mock(RemoteAnimationTargetCompat.class), this); proxy.onBuildTargetParams(
return new SurfaceParams[] {builder.build()}; transaction.mockProperties, mock(RemoteAnimationTargetCompat.class), this);
return transaction;
} }
@Override @Override
public void applySurfaceParams(SurfaceParams[] params) { public void applySurfaceParams(SurfaceTransaction params) {
Assert.assertTrue(params instanceof RecordingSurfaceTransaction);
MockProperties p = ((RecordingSurfaceTransaction) params).mockProperties;
// Verify that the task position remains the same // Verify that the task position remains the same
RectF newAppBounds = new RectF(mAppBounds); RectF newAppBounds = new RectF(mAppBounds);
params[0].matrix.mapRect(newAppBounds); p.matrix.mapRect(newAppBounds);
Assert.assertThat(newAppBounds, new AlmostSame(mAppBounds)); Assert.assertThat(newAppBounds, new AlmostSame(mAppBounds));
System.err.println("Bounds mapped: " + mAppBounds + " => " + newAppBounds); System.err.println("Bounds mapped: " + mAppBounds + " => " + newAppBounds);