diff options
| author | 2023-08-18 00:35:12 +0000 | |
|---|---|---|
| committer | 2023-08-21 19:06:20 +0000 | |
| commit | c562feec706eb1ab9a5c04189ba69112ebf95de5 (patch) | |
| tree | 71932f3622411d9a29fa447ee20f99bc851b2a0e | |
| parent | a6e0c487ce35ea1509912da2c059c3a5bbdbbd10 (diff) | |
Pass extras Bundle in onRecentsAnimationStart
* Bundle will contain SplitBounds if recents
animation contains splitscreen targets
Test: Swiping up with single + split tasks
Bug: 254378592
Change-Id: Id386ad834f814597f5840d96df12527ed9ad1fe3
8 files changed, 66 insertions, 6 deletions
diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl index c7fd38092ec7..37663d59cafd 100644 --- a/core/java/android/view/IRecentsAnimationRunner.aidl +++ b/core/java/android/view/IRecentsAnimationRunner.aidl @@ -21,6 +21,7 @@ import android.graphics.Rect; import android.view.RemoteAnimationTarget; import android.view.IRecentsAnimationController; import android.window.TaskSnapshot; +import android.os.Bundle; /** * Interface that is used to callback from window manager to the process that runs a recents @@ -57,7 +58,7 @@ oneway interface IRecentsAnimationRunner { @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) void onAnimationStart(in IRecentsAnimationController controller, in RemoteAnimationTarget[] apps, in RemoteAnimationTarget[] wallpapers, - in Rect homeContentInsets, in Rect minimizedHomeBounds) = 2; + in Rect homeContentInsets, in Rect minimizedHomeBounds, in Bundle extras) = 2; /** * Called when the task of an activity that has been started while the recents animation diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java index f35eda6caef0..ac142e955b83 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java @@ -203,6 +203,17 @@ public class RecentTasksController implements TaskStackListenerCallback, } } + @Nullable + public SplitBounds getSplitBoundsForTaskId(int taskId) { + if (taskId == INVALID_TASK_ID) { + return null; + } + + // We could do extra verification of requiring both taskIds of a pair and verifying that + // the same split bounds object is returned... but meh. Seems unnecessary. + return mTaskSplitBoundsMap.get(taskId); + } + @Override public Context getContext() { return mContext; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java index a11d9528a170..dc6dc7910feb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java @@ -16,6 +16,7 @@ package com.android.wm.shell.recents; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.view.WindowManager.TRANSIT_CHANGE; @@ -23,6 +24,8 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED; import static android.view.WindowManager.TRANSIT_SLEEP; import static android.view.WindowManager.TRANSIT_TO_FRONT; +import static com.android.wm.shell.util.SplitBounds.KEY_EXTRA_SPLIT_BOUNDS; + import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.ActivityManager; @@ -69,6 +72,8 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { private final Transitions mTransitions; private final ShellExecutor mExecutor; + @Nullable + private final RecentTasksController mRecentTasksController; private IApplicationThread mAnimApp = null; private final ArrayList<RecentsController> mControllers = new ArrayList<>(); @@ -82,6 +87,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { @Nullable RecentTasksController recentTasksController) { mTransitions = transitions; mExecutor = transitions.getMainExecutor(); + mRecentTasksController = recentTasksController; if (!Transitions.ENABLE_SHELL_TRANSITIONS) return; if (recentTasksController == null) return; shellInit.addInitCallback(() -> { @@ -417,6 +423,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { mLeashMap = new ArrayMap<>(); mKeyguardLocked = (info.getFlags() & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0; + int closingSplitTaskId = INVALID_TASK_ID; final ArrayList<RemoteAnimationTarget> apps = new ArrayList<>(); final ArrayList<RemoteAnimationTarget> wallpapers = new ArrayList<>(); TransitionUtil.LeafTaskFilter leafTaskFilter = new TransitionUtil.LeafTaskFilter(); @@ -443,6 +450,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { apps.add(target); if (TransitionUtil.isClosingType(change.getMode())) { mPausingTasks.add(new TaskState(change, target.leash)); + closingSplitTaskId = change.getTaskInfo().taskId; if (taskInfo.topActivityType == ACTIVITY_TYPE_HOME) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, " adding pausing leaf home taskId=%d", taskInfo.taskId); @@ -500,13 +508,16 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler { } } t.apply(); + Bundle b = new Bundle(1 /*capacity*/); + b.putParcelable(KEY_EXTRA_SPLIT_BOUNDS, + mRecentTasksController.getSplitBoundsForTaskId(closingSplitTaskId)); try { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION, "[%d] RecentsController.start: calling onAnimationStart", mInstanceId); mListener.onAnimationStart(this, apps.toArray(new RemoteAnimationTarget[apps.size()]), wallpapers.toArray(new RemoteAnimationTarget[wallpapers.size()]), - new Rect(0, 0, 0, 0), new Rect()); + new Rect(0, 0, 0, 0), new Rect(), b); } catch (RemoteException e) { Slog.e(TAG, "Error starting recents animation", e); cancel("onAnimationStart() failed"); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/util/SplitBounds.java b/libs/WindowManager/Shell/src/com/android/wm/shell/util/SplitBounds.java index f209521b1da4..0edcff45f648 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/util/SplitBounds.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/util/SplitBounds.java @@ -26,6 +26,8 @@ import java.util.Objects; * tasks/leashes/etc in Launcher */ public class SplitBounds implements Parcelable { + public static final String KEY_EXTRA_SPLIT_BOUNDS = "key_SplitBounds"; + public final Rect leftTopBounds; public final Rect rightBottomBounds; /** This rect represents the actual gap between the two apps */ diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java index 2c69522413d5..9e9e1ca341eb 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java @@ -17,6 +17,7 @@ package com.android.wm.shell.recents; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; @@ -367,6 +368,37 @@ public class RecentTasksControllerTest extends ShellTestCase { verify(mRecentTasksController).notifyRecentTasksChanged(); } + @Test + public void getNullSplitBoundsNonSplitTask() { + SplitBounds sb = mRecentTasksController.getSplitBoundsForTaskId(3); + assertNull("splitBounds should be null for non-split task", sb); + } + + @Test + public void getNullSplitBoundsInvalidTask() { + SplitBounds sb = mRecentTasksController.getSplitBoundsForTaskId(INVALID_TASK_ID); + assertNull("splitBounds should be null for invalid taskID", sb); + } + + @Test + public void getSplitBoundsForSplitTask() { + SplitBounds pair1Bounds = mock(SplitBounds.class); + SplitBounds pair2Bounds = mock(SplitBounds.class); + + mRecentTasksController.addSplitPair(1, 2, pair1Bounds); + mRecentTasksController.addSplitPair(4, 3, pair2Bounds); + + SplitBounds splitBounds2 = mRecentTasksController.getSplitBoundsForTaskId(2); + SplitBounds splitBounds1 = mRecentTasksController.getSplitBoundsForTaskId(1); + assertEquals("Different splitBounds for same pair", splitBounds1, splitBounds2); + assertEquals(splitBounds1, pair1Bounds); + + SplitBounds splitBounds3 = mRecentTasksController.getSplitBoundsForTaskId(3); + SplitBounds splitBounds4 = mRecentTasksController.getSplitBoundsForTaskId(4); + assertEquals("Different splitBounds for same pair", splitBounds3, splitBounds4); + assertEquals(splitBounds4, pair2Bounds); + } + /** * Helper to create a task with a given task id. */ diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 45a5ce34f830..80040a384b9d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -200,11 +200,12 @@ public class ActivityManagerWrapper { @Override public void onAnimationStart(IRecentsAnimationController controller, RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, - Rect homeContentInsets, Rect minimizedHomeBounds) { + Rect homeContentInsets, Rect minimizedHomeBounds, + Bundle extras) { final RecentsAnimationControllerCompat controllerCompat = new RecentsAnimationControllerCompat(controller); animationHandler.onAnimationStart(controllerCompat, apps, - wallpapers, homeContentInsets, minimizedHomeBounds); + wallpapers, homeContentInsets, minimizedHomeBounds, extras); } @Override diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java index 8bddf217ccb4..24073501c946 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java @@ -17,6 +17,7 @@ package com.android.systemui.shared.system; import android.graphics.Rect; +import android.os.Bundle; import android.view.RemoteAnimationTarget; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -29,7 +30,7 @@ public interface RecentsAnimationListener { */ void onAnimationStart(RecentsAnimationControllerCompat controller, RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, - Rect homeContentInsets, Rect minimizedHomeBounds); + Rect homeContentInsets, Rect minimizedHomeBounds, Bundle extras); /** * Called when the animation into Recents was canceled. This call is made on the binder thread. diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 237846997e9e..def32a1bda87 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -40,6 +40,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.hardware.HardwareBuffer; import android.os.Binder; +import android.os.Bundle; import android.os.IBinder.DeathRecipient; import android.os.RemoteException; import android.os.SystemClock; @@ -546,7 +547,7 @@ public class RecentsAnimationController implements DeathRecipient { contentInsets = mTmpRect; } mRunner.onAnimationStart(mController, appTargets, wallpaperTargets, contentInsets, - null); + null, new Bundle()); ProtoLog.d(WM_DEBUG_RECENTS_ANIMATIONS, "startAnimation(): Notify animation start: %s", mPendingAnimations.stream() |