Use SyncRtSurfaceTransactionApplier for app closing/opening

To ensure 100% synchronization, fixing jank.

Test: Open and close apps
Bug: 78611607
Change-Id: I5646bb259c90b65e1abe0fd67c9918f6a2b196cc
This commit is contained in:
Jorim Jaggi
2018-05-23 14:19:45 +02:00
parent c0928c3ba0
commit 4a545dd1b2
3 changed files with 31 additions and 25 deletions

Binary file not shown.

View File

@@ -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,6 +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.SyncRtSurfaceTransactionApplier;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.SurfaceParams;
import com.android.systemui.shared.system.TransactionCompat;
import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -545,6 +548,13 @@ 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() {
@@ -554,13 +564,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
@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 +574,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();
@@ -588,7 +590,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.
@@ -599,22 +600,24 @@ 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);
TransactionCompat t = new TransactionCompat();
RemoteAnimationProvider.prepareTargetsForFirstFrame(closingTargets.apps, t,
MODE_OPENING);
t.setEarlyWakeup();
t.apply();
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[openingTargets.apps.length];
for (int i = openingTargets.apps.length - 1; i >= 0; i--) {
RemoteAnimationTargetCompat target = openingTargets.apps[i];
matrix.setScale(scale, scale);
matrix.postTranslate(transX0, transY0);
params[i] = new SurfaceParams(target.leash, mAlpha.value, matrix, crop,
RemoteAnimationProvider.getLayer(target, MODE_OPENING));
}
surfaceApplier.scheduleApply(params);
matrix.reset();
}
});

View File

@@ -54,11 +54,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
? Integer.MAX_VALUE
: target.prefixOrderIndex;
}
}