From 44b86c89bb85e65015fc0dd0e3cd9caafc99f4bb Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Mon, 13 Dec 2021 13:58:58 -0800 Subject: [PATCH] Use all targets passed back for recents animation * Previously we were removing all targets except for the app that was to be animated. That caused issues because we look for the home app to determine if the app leashes need to be drawn underneath or not. * Now (assuming at most two non-home app leashes will be sent) we add all the non-home targets along with the desired app target by excluding 1 of the 2 non-home apps Bug: 199936292 Change-Id: I252d6c663e9ca145ef394ac08d9a32da02d4a03b --- .../android/quickstep/RemoteTargetGluer.java | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java index a12a670d86..8e2b566346 100644 --- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java +++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java @@ -77,7 +77,7 @@ public class RemoteTargetGluer { for (int i = 0; i < mRemoteTargetHandles.length; i++) { RemoteAnimationTargetCompat primaryTaskTarget = targets.apps[i]; mRemoteTargetHandles[i].mTransformParams.setTargetSet( - createRemoteAnimationTargetsForTarget(primaryTaskTarget, targets)); + createRemoteAnimationTargetsForTarget(targets, null)); mRemoteTargetHandles[i].mTaskViewSimulator.setPreview(primaryTaskTarget, null); } return mRemoteTargetHandles; @@ -95,47 +95,68 @@ public class RemoteTargetGluer { } /** - * Assigns the provided splitIDs to the {@link #mRemoteTargetHandles}, with index 0 will beint + * Assigns the provided splitIDs to the {@link #mRemoteTargetHandles}, with index 0 will being * the left/top task, index 1 right/bottom */ public RemoteTargetHandle[] assignTargetsForSplitScreen(RemoteAnimationTargets targets, int[] splitIds) { - RemoteAnimationTargetCompat primaryTaskTarget; - RemoteAnimationTargetCompat secondaryTaskTarget; + RemoteAnimationTargetCompat topLeftTarget; // only one set if single/fullscreen task + RemoteAnimationTargetCompat bottomRightTarget; if (mRemoteTargetHandles.length == 1) { // If we're not in split screen, the splitIds count doesn't really matter since we // should always hit this case. mRemoteTargetHandles[0].mTransformParams.setTargetSet(targets); if (targets.apps.length > 0) { // Unclear why/when target.apps length == 0, but it sure does happen :( - primaryTaskTarget = targets.apps[0]; - mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(primaryTaskTarget, null); + topLeftTarget = targets.apps[0]; + mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(topLeftTarget, null); } } else { // split screen - primaryTaskTarget = targets.findTask(splitIds[0]); - secondaryTaskTarget = targets.findTask(splitIds[1]); + topLeftTarget = targets.findTask(splitIds[0]); + bottomRightTarget = targets.findTask(splitIds[1]); + // remoteTargetHandle[0] denotes topLeft task, so we pass in the bottomRight to exclude, + // vice versa mStagedSplitBounds = new StagedSplitBounds( - primaryTaskTarget.startScreenSpaceBounds, - secondaryTaskTarget.startScreenSpaceBounds, splitIds[0], splitIds[1]); + topLeftTarget.startScreenSpaceBounds, + bottomRightTarget.startScreenSpaceBounds, splitIds[0], splitIds[1]); mRemoteTargetHandles[0].mTransformParams.setTargetSet( - createRemoteAnimationTargetsForTarget(primaryTaskTarget, targets)); - mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(primaryTaskTarget, + createRemoteAnimationTargetsForTarget(targets, bottomRightTarget)); + mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(topLeftTarget, mStagedSplitBounds); mRemoteTargetHandles[1].mTransformParams.setTargetSet( - createRemoteAnimationTargetsForTarget(secondaryTaskTarget, targets)); - mRemoteTargetHandles[1].mTaskViewSimulator.setPreview(secondaryTaskTarget, + createRemoteAnimationTargetsForTarget(targets, topLeftTarget)); + mRemoteTargetHandles[1].mTaskViewSimulator.setPreview(bottomRightTarget, mStagedSplitBounds); } return mRemoteTargetHandles; } + /** + * Ensures that we aren't excluding ancillary targets such as home/recents + * + * @param targetToExclude Will be excluded from the resulting return value. + * Pass in {@code null} to not exclude anything + * @return RemoteAnimationTargets where all the app targets from the passed in + * {@param targets} are included except {@param targetToExclude} + */ private RemoteAnimationTargets createRemoteAnimationTargetsForTarget( - RemoteAnimationTargetCompat target, - RemoteAnimationTargets targets) { - return new RemoteAnimationTargets(new RemoteAnimationTargetCompat[]{target}, + RemoteAnimationTargets targets, + @Nullable RemoteAnimationTargetCompat targetToExclude) { + int finalLength = targets.unfilteredApps.length - (targetToExclude == null ? 0 : 1); + RemoteAnimationTargetCompat[] targetsWithoutExcluded = + new RemoteAnimationTargetCompat[finalLength]; + int i = 0; + for (RemoteAnimationTargetCompat targetCompat : targets.unfilteredApps) { + if (targetCompat == targetToExclude) { + continue; + } + targetsWithoutExcluded[i] = targetCompat; + i++; + } + return new RemoteAnimationTargets(targetsWithoutExcluded, targets.wallpapers, targets.nonApps, targets.targetMode); }