Merge "Pass RecentsAnimationTargets to shell to reparent" into sc-v2-dev

This commit is contained in:
Vinit Nayak
2021-08-17 23:26:52 +00:00
committed by Android (Google) Code Review
4 changed files with 43 additions and 4 deletions

View File

@@ -95,6 +95,8 @@ interface ISplitScreen {
* Blocking call that notifies and gets additional split-screen targets when entering * Blocking call that notifies and gets additional split-screen targets when entering
* recents (for example: the dividerBar). * recents (for example: the dividerBar).
* @param cancel is true if leaving recents back to split (eg. the gesture was cancelled). * @param cancel is true if leaving recents back to split (eg. the gesture was cancelled).
* @param appTargets apps that will be re-parented to display area
*/ */
RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel) = 12; RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel,
in RemoteAnimationTarget[] appTargets) = 12;
} }

View File

@@ -43,6 +43,7 @@ import android.view.RemoteAnimationAdapter;
import android.view.RemoteAnimationTarget; import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.SurfaceSession;
import android.window.IRemoteTransition; import android.window.IRemoteTransition;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
@@ -281,8 +282,24 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct); mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct);
} }
RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel) { RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel, RemoteAnimationTarget[] apps) {
if (!isSplitScreenVisible()) return null; if (!isSplitScreenVisible()) return null;
final SurfaceControl.Builder builder = new SurfaceControl.Builder(new SurfaceSession())
.setContainerLayer()
.setName("RecentsAnimationSplitTasks")
.setHidden(false)
.setCallsite("SplitScreenController#onGoingtoRecentsLegacy");
mRootTDAOrganizer.attachToDisplayArea(DEFAULT_DISPLAY, builder);
SurfaceControl sc = builder.build();
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
for (RemoteAnimationTarget appTarget : apps) {
// TODO(b/195958376) set the correct layer/z-order in transaction for the new surface
transaction.reparent(appTarget.leash, sc);
transaction.setPosition(appTarget.leash, appTarget.screenSpaceBounds.left,
appTarget.screenSpaceBounds.top);
}
transaction.apply();
transaction.close();
return new RemoteAnimationTarget[]{mStageCoordinator.getDividerBarLegacyTarget()}; return new RemoteAnimationTarget[]{mStageCoordinator.getDividerBarLegacyTarget()};
} }
@@ -554,10 +571,11 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
} }
@Override @Override
public RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel) { public RemoteAnimationTarget[] onGoingToRecentsLegacy(boolean cancel,
RemoteAnimationTarget[] apps) {
final RemoteAnimationTarget[][] out = new RemoteAnimationTarget[][]{null}; final RemoteAnimationTarget[][] out = new RemoteAnimationTarget[][]{null};
executeRemoteCallWithTaskPermission(mController, "onGoingToRecentsLegacy", executeRemoteCallWithTaskPermission(mController, "onGoingToRecentsLegacy",
(controller) -> out[0] = controller.onGoingToRecentsLegacy(cancel), (controller) -> out[0] = controller.onGoingToRecentsLegacy(cancel, apps),
true /* blocking */); true /* blocking */);
return out[0]; return out[0];
} }

View File

@@ -81,6 +81,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.TransactionPool;
import com.android.wm.shell.common.split.SplitLayout; import com.android.wm.shell.common.split.SplitLayout;
import com.android.wm.shell.common.split.SplitLayout.SplitPosition; import com.android.wm.shell.common.split.SplitLayout.SplitPosition;
import com.android.wm.shell.common.split.SplitWindowManager;
import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.transition.Transitions;

View File

@@ -74,6 +74,10 @@ public class RemoteAnimationTargetCompat {
private final SurfaceControl mStartLeash; private final SurfaceControl mStartLeash;
// Fields used only to unrap into RemoteAnimationTarget
private final WindowConfiguration windowConfiguration;
private final Rect startBounds;
public RemoteAnimationTargetCompat(RemoteAnimationTarget app) { public RemoteAnimationTargetCompat(RemoteAnimationTarget app) {
taskId = app.taskId; taskId = app.taskId;
mode = app.mode; mode = app.mode;
@@ -94,6 +98,8 @@ public class RemoteAnimationTargetCompat {
mStartLeash = app.startLeash; mStartLeash = app.startLeash;
windowType = app.windowType; windowType = app.windowType;
windowConfiguration = app.windowConfiguration;
startBounds = app.startBounds;
} }
private static int newModeToLegacyMode(int newMode) { private static int newModeToLegacyMode(int newMode) {
@@ -109,6 +115,14 @@ public class RemoteAnimationTargetCompat {
} }
} }
public RemoteAnimationTarget unwrap() {
return new RemoteAnimationTarget(
taskId, mode, leash.getSurfaceControl(), isTranslucent, clipRect, contentInsets,
prefixOrderIndex, position, localBounds, screenSpaceBounds, windowConfiguration,
isNotInRecents, mStartLeash, startBounds, taskInfo, allowEnterPip, windowType
);
}
/** /**
* Almost a copy of Transitions#setupStartState. * Almost a copy of Transitions#setupStartState.
@@ -220,6 +234,10 @@ public class RemoteAnimationTargetCompat {
mStartLeash = null; mStartLeash = null;
rotationChange = change.getEndRotation() - change.getStartRotation(); rotationChange = change.getEndRotation() - change.getStartRotation();
windowType = INVALID_WINDOW_TYPE; windowType = INVALID_WINDOW_TYPE;
// TODO this probably isn't right but it's unused for now /shrug
windowConfiguration = new WindowConfiguration();
startBounds = change.getStartAbsBounds();
} }
public static RemoteAnimationTargetCompat[] wrap(RemoteAnimationTarget[] apps) { public static RemoteAnimationTargetCompat[] wrap(RemoteAnimationTarget[] apps) {