From 022e6bcda7348ed089ace25ce87b2f936c200e51 Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Tue, 15 Feb 2022 16:03:55 +0800 Subject: [PATCH] Refactor startIntentAndTaskWithLegacyTransition Migrate startIntentAndTaskWithLegacyTransition and startTasksWithLegacyTransition as single function and remove unnecessary param intentFirst because we could use sidePosition to decide stage position. Bug: 218613028 Test: pass existing tests Test: manual Change-Id: I1067ebb1ef2b101c369452728e4e626f8513e579 --- .../wm/shell/splitscreen/ISplitScreen.aidl | 5 +- .../splitscreen/SplitScreenController.java | 9 +- .../shell/splitscreen/StageCoordinator.java | 136 ++++-------------- 3 files changed, 30 insertions(+), 120 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl index d022ec15f232f..13137faa529fb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl @@ -97,9 +97,8 @@ interface ISplitScreen { * Start a pair of intent and task using legacy transition system. */ oneway void startIntentAndTaskWithLegacyTransition(in PendingIntent pendingIntent, - in Intent fillInIntent, int taskId, boolean intentFirst, in Bundle mainOptions, - in Bundle sideOptions, int sidePosition, float splitRatio, - in RemoteAnimationAdapter adapter) = 12; + in Intent fillInIntent, int taskId, in Bundle mainOptions,in Bundle sideOptions, + int sidePosition, float splitRatio, in RemoteAnimationAdapter adapter) = 12; /** * Blocking call that notifies and gets additional split-screen targets when entering diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 990b53a601f30..f6d317edeba93 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -642,14 +642,13 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @Override public void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, - Intent fillInIntent, int taskId, boolean intentFirst, Bundle mainOptions, - Bundle sideOptions, int sidePosition, float splitRatio, - RemoteAnimationAdapter adapter) { + Intent fillInIntent, int taskId, Bundle mainOptions, Bundle sideOptions, + int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) { executeRemoteCallWithTaskPermission(mController, "startIntentAndTaskWithLegacyTransition", (controller) -> controller.mStageCoordinator.startIntentAndTaskWithLegacyTransition( - pendingIntent, fillInIntent, taskId, intentFirst, mainOptions, - sideOptions, sidePosition, splitRatio, adapter)); + pendingIntent, fillInIntent, taskId, mainOptions, sideOptions, + sidePosition, splitRatio, adapter)); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 029d073cb3d53..81dacdb753a74 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -373,6 +373,23 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, void startTasksWithLegacyTransition(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) { + startWithLegacyTransition(mainTaskId, sideTaskId, null /* pendingIntent */, + null /* fillInIntent */, mainOptions, sideOptions, sidePosition, splitRatio, + adapter); + } + + /** Start an intent and a task ordered by {@code intentFirst}. */ + void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent, + int taskId, @Nullable Bundle mainOptions, @Nullable Bundle sideOptions, + @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) { + startWithLegacyTransition(taskId, INVALID_TASK_ID, pendingIntent, fillInIntent, + mainOptions, sideOptions, sidePosition, splitRatio, adapter); + } + + private void startWithLegacyTransition(int mainTaskId, int sideTaskId, + @Nullable PendingIntent pendingIntent, @Nullable Intent fillInIntent, + @Nullable Bundle mainOptions, @Nullable Bundle sideOptions, + @SplitPosition int sidePosition, float splitRatio, RemoteAnimationAdapter adapter) { // Init divider first to make divider leash for remote animation target. mSplitLayout.init(); // Set false to avoid record new bounds with old task still on top; @@ -466,124 +483,19 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, addActivityOptions(sideOptions, mSideStage); // Add task launch requests - wct.startTask(mainTaskId, mainOptions); - wct.startTask(sideTaskId, sideOptions); + if (pendingIntent != null && fillInIntent != null) { + wct.startTask(mainTaskId, mainOptions); + wct.sendPendingIntent(pendingIntent, fillInIntent, sideOptions); + } else { + wct.startTask(mainTaskId, mainOptions); + wct.startTask(sideTaskId, sideOptions); + } // Using legacy transitions, so we can't use blast sync since it conflicts. mTaskOrganizer.applyTransaction(wct); mSyncQueue.runInSync(t -> updateSurfaceBounds(mSplitLayout, t)); } - /** Start an intent and a task ordered by {@code intentFirst}. */ - void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent, - int taskId, boolean intentFirst, @Nullable Bundle mainOptions, - @Nullable Bundle sideOptions, @SplitPosition int sidePosition, float splitRatio, - RemoteAnimationAdapter adapter) { - // TODO: try pulling the first chunk of this method into a method so that it can be shared - // with startTasksWithLegacyTransition. So far attempts to do so result in failure in split. - - // Init divider first to make divider leash for remote animation target. - mSplitLayout.init(); - // Set false to avoid record new bounds with old task still on top; - mShouldUpdateRecents = false; - final WindowContainerTransaction wct = new WindowContainerTransaction(); - final WindowContainerTransaction evictWct = new WindowContainerTransaction(); - prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct); - prepareEvictChildTasks(SPLIT_POSITION_BOTTOM_OR_RIGHT, evictWct); - // Need to add another wrapper here in shell so that we can inject the divider bar - // and also manage the process elevation via setRunningRemote - IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { - @Override - public void onAnimationStart(@WindowManager.TransitionOldType int transit, - RemoteAnimationTarget[] apps, - RemoteAnimationTarget[] wallpapers, - RemoteAnimationTarget[] nonApps, - final IRemoteAnimationFinishedCallback finishedCallback) { - RemoteAnimationTarget[] augmentedNonApps = - new RemoteAnimationTarget[nonApps.length + 1]; - for (int i = 0; i < nonApps.length; ++i) { - augmentedNonApps[i] = nonApps[i]; - } - augmentedNonApps[augmentedNonApps.length - 1] = getDividerBarLegacyTarget(); - - IRemoteAnimationFinishedCallback wrapCallback = - new IRemoteAnimationFinishedCallback.Stub() { - @Override - public void onAnimationFinished() throws RemoteException { - mShouldUpdateRecents = true; - mSyncQueue.queue(evictWct); - mSyncQueue.runInSync(t -> setDividerVisibility(true, t)); - finishedCallback.onAnimationFinished(); - } - }; - try { - try { - ActivityTaskManager.getService().setRunningRemoteTransitionDelegate( - adapter.getCallingApplication()); - } catch (SecurityException e) { - Slog.e(TAG, "Unable to boost animation thread. This should only happen" - + " during unit tests"); - } - adapter.getRunner().onAnimationStart(transit, apps, wallpapers, - augmentedNonApps, wrapCallback); - } catch (RemoteException e) { - Slog.e(TAG, "Error starting remote animation", e); - } - } - - @Override - public void onAnimationCancelled() { - mShouldUpdateRecents = true; - mSyncQueue.queue(evictWct); - mSyncQueue.runInSync(t -> setDividerVisibility(true, t)); - try { - adapter.getRunner().onAnimationCancelled(); - } catch (RemoteException e) { - Slog.e(TAG, "Error starting remote animation", e); - } - } - }; - RemoteAnimationAdapter wrappedAdapter = new RemoteAnimationAdapter( - wrapper, adapter.getDuration(), adapter.getStatusBarTransitionDelay()); - - if (mainOptions == null) { - mainOptions = ActivityOptions.makeRemoteAnimation(wrappedAdapter).toBundle(); - } else { - ActivityOptions mainActivityOptions = ActivityOptions.fromBundle(mainOptions); - mainActivityOptions.update(ActivityOptions.makeRemoteAnimation(wrappedAdapter)); - mainOptions = mainActivityOptions.toBundle(); - } - - sideOptions = sideOptions != null ? sideOptions : new Bundle(); - setSideStagePosition(sidePosition, wct); - - mSplitLayout.setDivideRatio(splitRatio); - if (mMainStage.isActive()) { - mMainStage.moveToTop(getMainStageBounds(), wct); - } else { - // Build a request WCT that will launch both apps such that task 0 is on the main stage - // while task 1 is on the side stage. - mMainStage.activate(getMainStageBounds(), wct, false /* reparent */); - } - mSideStage.moveToTop(getSideStageBounds(), wct); - - // Make sure the launch options will put tasks in the corresponding split roots - addActivityOptions(mainOptions, mMainStage); - addActivityOptions(sideOptions, mSideStage); - - // Add task launch requests - if (intentFirst) { - wct.sendPendingIntent(pendingIntent, fillInIntent, mainOptions); - wct.startTask(taskId, sideOptions); - } else { - wct.startTask(taskId, mainOptions); - wct.sendPendingIntent(pendingIntent, fillInIntent, sideOptions); - } - - // Using legacy transitions, so we can't use blast sync since it conflicts. - mTaskOrganizer.applyTransaction(wct); - } - /** * Collects all the current child tasks of a specific split and prepares transaction to evict * them to display.