From 1008f6d72e29af8914526e6a7ce753ae3bdcdfc5 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 23 May 2018 14:19:45 +0200 Subject: [PATCH 1/2] Use SyncRtSurfaceTransactionApplier for app opening To ensure 100% synchronization, fixing jank. Test: Open and close apps Bug: 78611607 Change-Id: I6843e88ab1de0b8e7d80e6a6f547b895b527d093 --- quickstep/libs/sysui_shared.jar | Bin 129096 -> 131921 bytes .../LauncherAppTransitionManagerImpl.java | 93 +++++++++--------- .../util/RemoteAnimationProvider.java | 13 ++- 3 files changed, 57 insertions(+), 49 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 53a6ceb4d06e87b31c69070e18eb74622257cc26..41bf7299742b44f2331aa24db043245a54290060 100644 GIT binary patch delta 11675 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 SmT;DE(rj>W#}l_jfcsz33MSD2 delta 8876 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 Lmim!zfEfP|r7aQx diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 3075c3f48d..2c5b815bda 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -71,6 +71,7 @@ import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityCompat; @@ -79,7 +80,8 @@ import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; -import com.android.systemui.shared.system.TransactionCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.SurfaceParams; import com.android.systemui.shared.system.WindowManagerWrapper; /** @@ -545,22 +547,21 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Rect crop = new Rect(); Matrix matrix = new Matrix(); + RemoteAnimationTargetSet openingTargets = new RemoteAnimationTargetSet(targets, + MODE_OPENING); + RemoteAnimationTargetSet closingTargets = new RemoteAnimationTargetSet(targets, + MODE_CLOSING); + SyncRtSurfaceTransactionApplier surfaceApplier = new SyncRtSurfaceTransactionApplier( + mFloatingView); + ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setDuration(APP_LAUNCH_DURATION); appAnimator.addUpdateListener(new MultiValueUpdateListener() { // Fade alpha for the app window. FloatProp mAlpha = new FloatProp(0f, 1f, 0, 60, LINEAR); - boolean isFirstFrame = true; @Override public void onUpdate(float percent) { - final Surface surface = getSurface(mFloatingView); - final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; - if (frameNumber == -1) { - // Booo, not cool! Our surface got destroyed, so no reason to animate anything. - Log.w(TAG, "Failed to animate, surface got destroyed."); - return; - } final float easePercent = AGGRESSIVE_EASE.getInterpolation(percent); // Calculate app icon size. @@ -571,7 +572,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float scaleX = iconWidth / windowTargetBounds.width(); float scaleY = iconHeight / windowTargetBounds.height(); float scale = Math.min(1f, Math.min(scaleX, scaleY)); - matrix.setScale(scale, scale); // Position the scaled window on top of the icon int windowWidth = windowTargetBounds.width(); @@ -585,7 +585,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float transX0 = floatingViewBounds[0] - offsetX; float transY0 = floatingViewBounds[1] - offsetY; - matrix.postTranslate(transX0, transY0); // Animate the window crop so that it starts off as a square, and then reveals // horizontally. @@ -596,23 +595,27 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag crop.right = windowWidth; crop.bottom = (int) (crop.top + cropHeight); - TransactionCompat t = new TransactionCompat(); - if (isFirstFrame) { - RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_OPENING); - isFirstFrame = false; - } - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == MODE_OPENING) { - t.setAlpha(target.leash, mAlpha.value); - t.setMatrix(target.leash, matrix); - t.setWindowCrop(target.leash, crop); - t.deferTransactionUntil(target.leash, surface, getNextFrameNumber(surface)); - } - } - t.setEarlyWakeup(); - t.apply(); + SurfaceParams[] params = new SurfaceParams[targets.length]; + for (int i = targets.length - 1; i >= 0; i--) { + RemoteAnimationTargetCompat target = targets[i]; - matrix.reset(); + Rect targetCrop; + float alpha; + if (target.mode == MODE_OPENING) { + matrix.setScale(scale, scale); + matrix.postTranslate(transX0, transY0); + targetCrop = crop; + alpha = mAlpha.value; + } else { + matrix.reset(); + alpha = 1f; + targetCrop = target.sourceContainerBounds; + } + + params[i] = new SurfaceParams(target.leash, alpha, matrix, targetCrop, + RemoteAnimationProvider.getLayer(target, MODE_OPENING)); + } + surfaceApplier.scheduleApply(params); } }); return appAnimator; @@ -692,6 +695,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag * Animator that controls the transformations of the windows the targets that are closing. */ private Animator getClosingWindowAnimators(RemoteAnimationTargetCompat[] targets) { + SyncRtSurfaceTransactionApplier surfaceApplier = + new SyncRtSurfaceTransactionApplier(mDragLayer); Matrix matrix = new Matrix(); ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); int duration = CLOSING_TRANSITION_DURATION_MS; @@ -701,30 +706,28 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag FloatProp mScale = new FloatProp(1f, 1f, 0, duration, DEACCEL_1_7); FloatProp mAlpha = new FloatProp(1f, 0f, 25, 125, LINEAR); - boolean isFirstFrame = true; - @Override public void onUpdate(float percent) { - TransactionCompat t = new TransactionCompat(); - if (isFirstFrame) { - RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_CLOSING); - isFirstFrame = false; - } - for (RemoteAnimationTargetCompat app : targets) { - if (app.mode == RemoteAnimationTargetCompat.MODE_CLOSING) { - t.setAlpha(app.leash, mAlpha.value); + SurfaceParams[] params = new SurfaceParams[targets.length]; + for (int i = targets.length - 1; i >= 0; i--) { + RemoteAnimationTargetCompat target = targets[i]; + float alpha; + if (target.mode == MODE_CLOSING) { matrix.setScale(mScale.value, mScale.value, - app.sourceContainerBounds.centerX(), - app.sourceContainerBounds.centerY()); + target.sourceContainerBounds.centerX(), + target.sourceContainerBounds.centerY()); matrix.postTranslate(0, mDy.value); - matrix.postTranslate(app.position.x, app.position.y); - t.setMatrix(app.leash, matrix); + matrix.postTranslate(target.position.x, target.position.y); + alpha = mAlpha.value; + } else { + matrix.reset(); + alpha = 1f; } + params[i] = new SurfaceParams(target.leash, alpha, matrix, + target.sourceContainerBounds, + RemoteAnimationProvider.getLayer(target, MODE_CLOSING)); } - t.setEarlyWakeup(); - t.apply(); - - matrix.reset(); + surfaceApplier.scheduleApply(params); } }); diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java index bbf223d1ef..a7e6d74f02 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java @@ -28,6 +28,8 @@ import com.android.systemui.shared.system.TransactionCompat; @FunctionalInterface public interface RemoteAnimationProvider { + static final int Z_BOOST_BASE = 800570000; + AnimatorSet createWindowAnimation(RemoteAnimationTargetCompat[] targets); default ActivityOptions toActivityOptions(Handler handler, long duration) { @@ -54,11 +56,14 @@ public interface RemoteAnimationProvider { static void prepareTargetsForFirstFrame(RemoteAnimationTargetCompat[] targets, TransactionCompat t, int boostModeTargets) { for (RemoteAnimationTargetCompat target : targets) { - int layer = target.mode == boostModeTargets - ? Integer.MAX_VALUE - : target.prefixOrderIndex; - t.setLayer(target.leash, layer); + t.setLayer(target.leash, getLayer(target, boostModeTargets)); t.show(target.leash); } } + + static int getLayer(RemoteAnimationTargetCompat target, int boostModeTarget) { + return target.mode == boostModeTarget + ? Z_BOOST_BASE + target.prefixOrderIndex + : target.prefixOrderIndex; + } } From 80b931478167820978bdccb1f6e0bb494504a9ab Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 29 May 2018 15:45:47 +0200 Subject: [PATCH 2/2] Use SyncRtSurfaceTransactionApplier for recents enter/exit To ensure proper synchronization, fixing jank. Furthermore, we need to move the background choreographer to vsync-sf pulse in order to allow for a smooth transition background -> foreground when handling the touch. Test: Swipe up, disable swipe, press recents to enter/exit Bug: 80292740 Change-Id: Ie58616edf6432a0154d6dbf8497218721154d2b8 --- quickstep/libs/sysui_shared.jar | Bin 131921 -> 132159 bytes .../quickstep/OverviewCommandHelper.java | 6 +- .../src/com/android/quickstep/TaskUtils.java | 24 ++---- .../quickstep/TouchInteractionService.java | 3 +- .../WindowTransformSwipeHandler.java | 9 ++- .../quickstep/util/ClipAnimationHelper.java | 74 +++++++++++------- .../util/RemoteAnimationTargetSet.java | 2 + 7 files changed, 70 insertions(+), 48 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 41bf7299742b44f2331aa24db043245a54290060..308e92f666c2170ee3ba2fa5c365528ef60cac89 100644 GIT binary patch delta 7648 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 LT73r(h2sAJjznd3 diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 7b29323835..8082d30f2b 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -65,6 +65,7 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; import com.android.systemui.shared.system.TransactionCompat; import java.util.ArrayList; @@ -348,11 +349,14 @@ public class OverviewCommandHelper { clipHelper.updateTargetRect(targetRect); clipHelper.prepareAnimation(false /* isOpening */); + SyncRtSurfaceTransactionApplier syncTransactionApplier = + new SyncRtSurfaceTransactionApplier(rootView); ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); valueAnimator.setDuration(RECENTS_LAUNCH_DURATION); valueAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); valueAnimator.addUpdateListener((v) -> - clipHelper.applyTransform(targetSet, (float) v.getAnimatedValue())); + clipHelper.applyTransform(targetSet, (float) v.getAnimatedValue(), + syncTransactionApplier)); if (targetSet.isAnimatingHome()) { // If we are animating home, fade in the opening targets diff --git a/quickstep/src/com/android/quickstep/TaskUtils.java b/quickstep/src/com/android/quickstep/TaskUtils.java index 2b0c98f939..ec2c318d35 100644 --- a/quickstep/src/com/android/quickstep/TaskUtils.java +++ b/quickstep/src/com/android/quickstep/TaskUtils.java @@ -46,6 +46,7 @@ import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; import java.util.List; @@ -144,6 +145,8 @@ public class TaskUtils { */ public static ValueAnimator getRecentsWindowAnimator(TaskView v, boolean skipViewChanges, RemoteAnimationTargetCompat[] targets, final ClipAnimationHelper inOutHelper) { + SyncRtSurfaceTransactionApplier syncTransactionApplier = + new SyncRtSurfaceTransactionApplier(v); final ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setInterpolator(TOUCH_RESPONSE_INTERPOLATOR); appAnimator.addUpdateListener(new MultiValueUpdateListener() { @@ -155,18 +158,10 @@ public class TaskUtils { final RemoteAnimationTargetSet mTargetSet; final RectF mThumbnailRect; - private Surface mSurface; - private long mFrameNumber; { mTargetSet = new RemoteAnimationTargetSet(targets, MODE_OPENING); - inOutHelper.setTaskTransformCallback((t, app) -> { - t.setAlpha(app.leash, mTaskAlpha.value); - - if (!skipViewChanges) { - t.deferTransactionUntil(app.leash, mSurface, mFrameNumber); - } - }); + inOutHelper.setTaskAlphaCallback((t, alpha) -> mTaskAlpha.value); inOutHelper.prepareAnimation(true /* isOpening */); inOutHelper.fromTaskThumbnailView(v.getThumbnail(), (RecentsView) v.getParent(), @@ -179,15 +174,8 @@ public class TaskUtils { @Override public void onUpdate(float percent) { - mSurface = getSurface(v); - mFrameNumber = mSurface != null ? getNextFrameNumber(mSurface) : -1; - if (mFrameNumber == -1) { - // Booo, not cool! Our surface got destroyed, so no reason to animate anything. - Log.w(TAG, "Failed to animate, surface got destroyed."); - return; - } - - RectF taskBounds = inOutHelper.applyTransform(mTargetSet, 1 - percent); + RectF taskBounds = inOutHelper.applyTransform(mTargetSet, 1 - percent, + syncTransactionApplier); if (!skipViewChanges) { float scale = taskBounds.width() / mThumbnailRect.width(); v.setScaleX(scale); diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index aecb66c77d..49a4ac8bab 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -49,6 +49,7 @@ import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.ChoreographerCompat; import com.android.systemui.shared.system.NavigationBarCompat.HitTarget; /** @@ -406,6 +407,6 @@ public class TouchInteractionService extends Service { sRemoteUiThread.start(); } new Handler(sRemoteUiThread.getLooper()).post(() -> - mBackgroundThreadChoreographer = Choreographer.getInstance()); + mBackgroundThreadChoreographer = ChoreographerCompat.getSfInstance()); } } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 84b2176488..a1d05848f7 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -73,6 +73,7 @@ import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.LatencyTrackerCompat; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; import com.android.systemui.shared.system.WindowCallbacksCompat; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -180,6 +181,7 @@ public class WindowTransformSwipeHandler { private T mActivity; private LayoutListener mLayoutListener; private RecentsView mRecentsView; + private SyncRtSurfaceTransactionApplier mSyncTransactionApplier; private QuickScrubController mQuickScrubController; private AnimationFactory mAnimationFactory = (t) -> { }; @@ -346,6 +348,7 @@ public class WindowTransformSwipeHandler { } mRecentsView = activity.getOverviewPanel(); + mSyncTransactionApplier = new SyncRtSurfaceTransactionApplier(mRecentsView); mQuickScrubController = mRecentsView.getQuickScrubController(); mLayoutListener = mActivityControlHelper.createLayoutListener(mActivity); @@ -503,7 +506,11 @@ public class WindowTransformSwipeHandler { RecentsAnimationControllerCompat controller = mRecentsAnimationWrapper.getController(); if (controller != null) { - mClipAnimationHelper.applyTransform(mRecentsAnimationWrapper.targetSet, shift); + + mClipAnimationHelper.applyTransform(mRecentsAnimationWrapper.targetSet, shift, + Looper.myLooper() == mMainThreadHandler.getLooper() + ? mSyncTransactionApplier + : null); // TODO: This logic is spartanic! boolean passedThreshold = shift > 0.12f; diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 8c7f104a64..62a169ce68 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -30,6 +30,7 @@ import android.graphics.RectF; import android.os.Build; import android.os.RemoteException; import android.support.annotation.Nullable; +import android.view.Surface; import android.view.animation.Interpolator; import com.android.launcher3.BaseDraggingActivity; @@ -44,10 +45,13 @@ import com.android.quickstep.views.TaskThumbnailView; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.utilities.RectFEvaluator; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.SurfaceParams; import com.android.systemui.shared.system.TransactionCompat; import com.android.systemui.shared.system.WindowManagerWrapper; import java.util.function.BiConsumer; +import java.util.function.BiFunction; /** * Utility class to handle window clip animation @@ -89,8 +93,8 @@ public class ClipAnimationHelper { // Wether or not applyTransform has been called yet since prepareAnimation() private boolean mIsFirstFrame = true; - private BiConsumer mTaskTransformCallback = - (t, a) -> { }; + private BiFunction mTaskAlphaCallback = + (t, a1) -> a1; private void updateSourceStack(RemoteAnimationTargetCompat target) { mSourceInsets.set(target.contentInsets); @@ -131,11 +135,11 @@ public class ClipAnimationHelper { } public void prepareAnimation(boolean isOpening) { - mIsFirstFrame = true; mBoostModeTargetLayers = isOpening ? MODE_OPENING : MODE_CLOSING; } - public RectF applyTransform(RemoteAnimationTargetSet targetSet, float progress) { + public RectF applyTransform(RemoteAnimationTargetSet targetSet, float progress, + @Nullable SyncRtSurfaceTransactionApplier syncTransactionApplier) { RectF currentRect; mTmpRectF.set(mTargetRect); Utilities.scaleRectFAboutCenter(mTmpRectF, mTargetScale); @@ -155,35 +159,51 @@ public class ClipAnimationHelper { mClipRect.bottom = (int) (mSourceStackBounds.height() - (mSourceWindowClipInsets.bottom * progress)); - TransactionCompat transaction = new TransactionCompat(); - if (mIsFirstFrame) { - RemoteAnimationProvider.prepareTargetsForFirstFrame(targetSet.unfilteredApps, - transaction, mBoostModeTargetLayers); - mIsFirstFrame = false; - } - for (RemoteAnimationTargetCompat app : targetSet.apps) { - if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { - mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); - mTmpMatrix.postTranslate(app.position.x, app.position.y); - transaction.setMatrix(app.leash, mTmpMatrix) - .setWindowCrop(app.leash, mClipRect); + SurfaceParams[] params = new SurfaceParams[targetSet.unfilteredApps.length]; + for (int i = 0; i < targetSet.unfilteredApps.length; i++) { + RemoteAnimationTargetCompat app = targetSet.unfilteredApps[i]; + mTmpMatrix.setTranslate(app.position.x, app.position.y); + Rect crop = app.sourceContainerBounds; + float alpha = 1f; + if (app.mode == targetSet.targetMode) { + if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + mTmpMatrix.setRectToRect(mSourceRect, currentRect, ScaleToFit.FILL); + mTmpMatrix.postTranslate(app.position.x, app.position.y); + crop = mClipRect; + } + + if (app.isNotInRecents + || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { + alpha = 1 - progress; + } + + alpha = mTaskAlphaCallback.apply(app, alpha); } - if (app.isNotInRecents - || app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) { - transaction.setAlpha(app.leash, 1 - progress); - } - - mTaskTransformCallback.accept(transaction, app); + params[i] = new SurfaceParams(app.leash, alpha, mTmpMatrix, crop, + RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers)); } - transaction.setEarlyWakeup(); - transaction.apply(); + applyParams(syncTransactionApplier, params); return currentRect; } - public void setTaskTransformCallback - (BiConsumer callback) { - mTaskTransformCallback = callback; + private void applyParams(@Nullable SyncRtSurfaceTransactionApplier syncTransactionApplier, + SurfaceParams[] params) { + if (syncTransactionApplier != null) { + syncTransactionApplier.scheduleApply(params); + } else { + TransactionCompat t = new TransactionCompat(); + for (SurfaceParams param : params) { + SyncRtSurfaceTransactionApplier.applyParams(t, param); + } + t.setEarlyWakeup(); + t.apply(); + } + } + + public void setTaskAlphaCallback( + BiFunction callback) { + mTaskAlphaCallback = callback; } public void offsetTarget(float scale, float offsetX, float offsetY, Interpolator interpolator) { diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java index 04b8be58bf..c3724853ae 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationTargetSet.java @@ -26,6 +26,7 @@ public class RemoteAnimationTargetSet { public final RemoteAnimationTargetCompat[] unfilteredApps; public final RemoteAnimationTargetCompat[] apps; + public final int targetMode; public RemoteAnimationTargetSet(RemoteAnimationTargetCompat[] apps, int targetMode) { ArrayList filteredApps = new ArrayList<>(); @@ -39,6 +40,7 @@ public class RemoteAnimationTargetSet { this.unfilteredApps = apps; this.apps = filteredApps.toArray(new RemoteAnimationTargetCompat[filteredApps.size()]); + this.targetMode = targetMode; } public RemoteAnimationTargetCompat findTask(int taskId) {