From 80b931478167820978bdccb1f6e0bb494504a9ab Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Tue, 29 May 2018 15:45:47 +0200 Subject: [PATCH] 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) {