summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/window/TransitionRequestInfo.aidl1
-rw-r--r--core/java/android/window/TransitionRequestInfo.java230
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java13
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java14
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskSupervisor.java3
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java14
-rw-r--r--services/core/java/com/android/server/wm/DisplayRotation.java6
-rw-r--r--services/core/java/com/android/server/wm/TransitionController.java17
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java3
11 files changed, 286 insertions, 22 deletions
diff --git a/core/java/android/window/TransitionRequestInfo.aidl b/core/java/android/window/TransitionRequestInfo.aidl
index d2b9ccfd657e..6f980d4d43df 100644
--- a/core/java/android/window/TransitionRequestInfo.aidl
+++ b/core/java/android/window/TransitionRequestInfo.aidl
@@ -17,3 +17,4 @@
package android.window;
parcelable TransitionRequestInfo;
+parcelable TransitionRequestInfo.DisplayChange;
diff --git a/core/java/android/window/TransitionRequestInfo.java b/core/java/android/window/TransitionRequestInfo.java
index f7707317efd7..e0cdb133c4ce 100644
--- a/core/java/android/window/TransitionRequestInfo.java
+++ b/core/java/android/window/TransitionRequestInfo.java
@@ -18,6 +18,8 @@ package android.window;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.WindowConfiguration;
+import android.graphics.Rect;
import android.os.Parcelable;
import android.view.WindowManager;
@@ -42,6 +44,194 @@ public final class TransitionRequestInfo implements Parcelable {
/** If non-null, a remote-transition associated with the source of this transition. */
private @Nullable RemoteTransition mRemoteTransition;
+ /**
+ * If non-null, this request was triggered by this display change. This will not be complete:
+ * The reliable parts should be flags, rotation start/end (if rotating), and start/end bounds
+ * (if size is changing).
+ */
+ private @Nullable DisplayChange mDisplayChange;
+
+ /** constructor override */
+ public TransitionRequestInfo(
+ @WindowManager.TransitionType int type,
+ @Nullable ActivityManager.RunningTaskInfo triggerTask,
+ @Nullable RemoteTransition remoteTransition) {
+ this(type, triggerTask, remoteTransition, null /* displayChange */);
+ }
+
+ /** Requested change to a display. */
+ @DataClass(genToString = true, genSetters = true, genBuilder = false, genConstructor = false)
+ public static class DisplayChange implements Parcelable {
+ private final int mDisplayId;
+ @Nullable private Rect mStartAbsBounds = null;
+ @Nullable private Rect mEndAbsBounds = null;
+ private int mStartRotation = WindowConfiguration.ROTATION_UNDEFINED;
+ private int mEndRotation = WindowConfiguration.ROTATION_UNDEFINED;
+
+ /** Create empty display-change. */
+ public DisplayChange(int displayId) {
+ mDisplayId = displayId;
+ }
+
+ /** Create a display-change representing a rotation. */
+ public DisplayChange(int displayId, int startRotation, int endRotation) {
+ mDisplayId = displayId;
+ mStartRotation = startRotation;
+ mEndRotation = endRotation;
+ }
+
+
+
+ // Code below generated by codegen v1.0.23.
+ //
+ // DO NOT MODIFY!
+ // CHECKSTYLE:OFF Generated code
+ //
+ // To regenerate run:
+ // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/window/TransitionRequestInfo.java
+ //
+ // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
+ // Settings > Editor > Code Style > Formatter Control
+ //@formatter:off
+
+
+ @DataClass.Generated.Member
+ public int getDisplayId() {
+ return mDisplayId;
+ }
+
+ @DataClass.Generated.Member
+ public @Nullable Rect getStartAbsBounds() {
+ return mStartAbsBounds;
+ }
+
+ @DataClass.Generated.Member
+ public @Nullable Rect getEndAbsBounds() {
+ return mEndAbsBounds;
+ }
+
+ @DataClass.Generated.Member
+ public int getStartRotation() {
+ return mStartRotation;
+ }
+
+ @DataClass.Generated.Member
+ public int getEndRotation() {
+ return mEndRotation;
+ }
+
+ @DataClass.Generated.Member
+ public @android.annotation.NonNull DisplayChange setStartAbsBounds(@android.annotation.NonNull Rect value) {
+ mStartAbsBounds = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public @android.annotation.NonNull DisplayChange setEndAbsBounds(@android.annotation.NonNull Rect value) {
+ mEndAbsBounds = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public @android.annotation.NonNull DisplayChange setStartRotation( int value) {
+ mStartRotation = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
+ public @android.annotation.NonNull DisplayChange setEndRotation( int value) {
+ mEndRotation = value;
+ return this;
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public String toString() {
+ // You can override field toString logic by defining methods like:
+ // String fieldNameToString() { ... }
+
+ return "DisplayChange { " +
+ "displayId = " + mDisplayId + ", " +
+ "startAbsBounds = " + mStartAbsBounds + ", " +
+ "endAbsBounds = " + mEndAbsBounds + ", " +
+ "startRotation = " + mStartRotation + ", " +
+ "endRotation = " + mEndRotation +
+ " }";
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public void writeToParcel(@android.annotation.NonNull android.os.Parcel dest, int flags) {
+ // You can override field parcelling by defining methods like:
+ // void parcelFieldName(Parcel dest, int flags) { ... }
+
+ byte flg = 0;
+ if (mStartAbsBounds != null) flg |= 0x2;
+ if (mEndAbsBounds != null) flg |= 0x4;
+ dest.writeByte(flg);
+ dest.writeInt(mDisplayId);
+ if (mStartAbsBounds != null) dest.writeTypedObject(mStartAbsBounds, flags);
+ if (mEndAbsBounds != null) dest.writeTypedObject(mEndAbsBounds, flags);
+ dest.writeInt(mStartRotation);
+ dest.writeInt(mEndRotation);
+ }
+
+ @Override
+ @DataClass.Generated.Member
+ public int describeContents() { return 0; }
+
+ /** @hide */
+ @SuppressWarnings({"unchecked", "RedundantCast"})
+ @DataClass.Generated.Member
+ protected DisplayChange(@android.annotation.NonNull android.os.Parcel in) {
+ // You can override field unparcelling by defining methods like:
+ // static FieldType unparcelFieldName(Parcel in) { ... }
+
+ byte flg = in.readByte();
+ int displayId = in.readInt();
+ Rect startAbsBounds = (flg & 0x2) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR);
+ Rect endAbsBounds = (flg & 0x4) == 0 ? null : (Rect) in.readTypedObject(Rect.CREATOR);
+ int startRotation = in.readInt();
+ int endRotation = in.readInt();
+
+ this.mDisplayId = displayId;
+ this.mStartAbsBounds = startAbsBounds;
+ this.mEndAbsBounds = endAbsBounds;
+ this.mStartRotation = startRotation;
+ this.mEndRotation = endRotation;
+
+ // onConstructed(); // You can define this method to get a callback
+ }
+
+ @DataClass.Generated.Member
+ public static final @android.annotation.NonNull Parcelable.Creator<DisplayChange> CREATOR
+ = new Parcelable.Creator<DisplayChange>() {
+ @Override
+ public DisplayChange[] newArray(int size) {
+ return new DisplayChange[size];
+ }
+
+ @Override
+ public DisplayChange createFromParcel(@android.annotation.NonNull android.os.Parcel in) {
+ return new DisplayChange(in);
+ }
+ };
+
+ @DataClass.Generated(
+ time = 1639445520915L,
+ codegenVersion = "1.0.23",
+ sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java",
+ inputSignatures = "private final int mDisplayId\nprivate @android.annotation.Nullable android.graphics.Rect mStartAbsBounds\nprivate @android.annotation.Nullable android.graphics.Rect mEndAbsBounds\nprivate int mStartRotation\nprivate int mEndRotation\nclass DisplayChange extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genBuilder=false, genConstructor=false)")
+ @Deprecated
+ private void __metadata() {}
+
+
+ //@formatter:on
+ // End of generated code
+
+ }
+
+
// Code below generated by codegen v1.0.23.
@@ -67,17 +257,23 @@ public final class TransitionRequestInfo implements Parcelable {
* finish) has caused this transition to occur.
* @param remoteTransition
* If non-null, a remote-transition associated with the source of this transition.
+ * @param displayChange
+ * If non-null, this request was triggered by this display change. This will not be complete:
+ * The reliable parts should be flags, rotation start/end (if rotating), and start/end bounds
+ * (if size is changing).
*/
@DataClass.Generated.Member
public TransitionRequestInfo(
@WindowManager.TransitionType int type,
@Nullable ActivityManager.RunningTaskInfo triggerTask,
- @Nullable RemoteTransition remoteTransition) {
+ @Nullable RemoteTransition remoteTransition,
+ @Nullable DisplayChange displayChange) {
this.mType = type;
com.android.internal.util.AnnotationValidations.validate(
WindowManager.TransitionType.class, null, mType);
this.mTriggerTask = triggerTask;
this.mRemoteTransition = remoteTransition;
+ this.mDisplayChange = displayChange;
// onConstructed(); // You can define this method to get a callback
}
@@ -108,6 +304,16 @@ public final class TransitionRequestInfo implements Parcelable {
}
/**
+ * If non-null, this request was triggered by this display change. This will not be complete:
+ * The reliable parts should be flags, rotation start/end (if rotating), and start/end bounds
+ * (if size is changing).
+ */
+ @DataClass.Generated.Member
+ public @Nullable DisplayChange getDisplayChange() {
+ return mDisplayChange;
+ }
+
+ /**
* If non-null, If non-null, the task containing the activity whose lifecycle change (start or
* finish) has caused this transition to occur.
*/
@@ -126,6 +332,17 @@ public final class TransitionRequestInfo implements Parcelable {
return this;
}
+ /**
+ * If non-null, this request was triggered by this display change. This will not be complete:
+ * The reliable parts should be flags, rotation start/end (if rotating), and start/end bounds
+ * (if size is changing).
+ */
+ @DataClass.Generated.Member
+ public @android.annotation.NonNull TransitionRequestInfo setDisplayChange(@android.annotation.NonNull DisplayChange value) {
+ mDisplayChange = value;
+ return this;
+ }
+
@Override
@DataClass.Generated.Member
public String toString() {
@@ -135,7 +352,8 @@ public final class TransitionRequestInfo implements Parcelable {
return "TransitionRequestInfo { " +
"type = " + mType + ", " +
"triggerTask = " + mTriggerTask + ", " +
- "remoteTransition = " + mRemoteTransition +
+ "remoteTransition = " + mRemoteTransition + ", " +
+ "displayChange = " + mDisplayChange +
" }";
}
@@ -148,10 +366,12 @@ public final class TransitionRequestInfo implements Parcelable {
byte flg = 0;
if (mTriggerTask != null) flg |= 0x2;
if (mRemoteTransition != null) flg |= 0x4;
+ if (mDisplayChange != null) flg |= 0x8;
dest.writeByte(flg);
dest.writeInt(mType);
if (mTriggerTask != null) dest.writeTypedObject(mTriggerTask, flags);
if (mRemoteTransition != null) dest.writeTypedObject(mRemoteTransition, flags);
+ if (mDisplayChange != null) dest.writeTypedObject(mDisplayChange, flags);
}
@Override
@@ -169,12 +389,14 @@ public final class TransitionRequestInfo implements Parcelable {
int type = in.readInt();
ActivityManager.RunningTaskInfo triggerTask = (flg & 0x2) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR);
RemoteTransition remoteTransition = (flg & 0x4) == 0 ? null : (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR);
+ DisplayChange displayChange = (flg & 0x8) == 0 ? null : (DisplayChange) in.readTypedObject(DisplayChange.CREATOR);
this.mType = type;
com.android.internal.util.AnnotationValidations.validate(
WindowManager.TransitionType.class, null, mType);
this.mTriggerTask = triggerTask;
this.mRemoteTransition = remoteTransition;
+ this.mDisplayChange = displayChange;
// onConstructed(); // You can define this method to get a callback
}
@@ -194,10 +416,10 @@ public final class TransitionRequestInfo implements Parcelable {
};
@DataClass.Generated(
- time = 1629321632222L,
+ time = 1639445520938L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java",
- inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)")
+ inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nprivate @android.annotation.Nullable android.window.TransitionRequestInfo.DisplayChange mDisplayChange\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)")
@Deprecated
private void __metadata() {}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
index ffda1f92ec90..c32733d4f73c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayChangeController.java
@@ -27,7 +27,6 @@ import androidx.annotation.BinderThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
-import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -71,12 +70,18 @@ public class DisplayChangeController {
mRotationListener.remove(listener);
}
+ /** Query all listeners for changes that should happen on rotation. */
+ public void dispatchOnRotateDisplay(WindowContainerTransaction outWct, int displayId,
+ final int fromRotation, final int toRotation) {
+ for (OnDisplayChangingListener c : mRotationListener) {
+ c.onRotateDisplay(displayId, fromRotation, toRotation, outWct);
+ }
+ }
+
private void onRotateDisplay(int displayId, final int fromRotation, final int toRotation,
IDisplayWindowRotationCallback callback) {
WindowContainerTransaction t = new WindowContainerTransaction();
- for (OnDisplayChangingListener c : mRotationListener) {
- c.onRotateDisplay(displayId, fromRotation, toRotation, t);
- }
+ dispatchOnRotateDisplay(t, displayId, fromRotation, toRotation);
try {
callback.continueRotateDisplay(toRotation, t);
} catch (RemoteException e) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
index a1fb658ccb9d..7db49f05a5dc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java
@@ -76,6 +76,11 @@ public class DisplayController {
}
}
+ /** Get the DisplayChangeController. */
+ public DisplayChangeController getChangeController() {
+ return mChangeController;
+ }
+
/**
* Gets a display by id from DisplayManager.
*/
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
index 804e449decf8..a7a178872905 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java
@@ -95,6 +95,7 @@ public class Transitions implements RemoteCallable<Transitions> {
private final ShellExecutor mAnimExecutor;
private final TransitionPlayerImpl mPlayerImpl;
private final RemoteTransitionHandler mRemoteTransitionHandler;
+ private final DisplayController mDisplayController;
private final ShellTransitionImpl mImpl = new ShellTransitionImpl();
/** List of possible handlers. Ordered by specificity (eg. tapped back to front). */
@@ -122,6 +123,7 @@ public class Transitions implements RemoteCallable<Transitions> {
mContext = context;
mMainExecutor = mainExecutor;
mAnimExecutor = animExecutor;
+ mDisplayController = displayController;
mPlayerImpl = new TransitionPlayerImpl();
// The very last handler (0 in the list) should be the default one.
mHandlers.add(new DefaultTransitionHandler(displayController, pool, context, mainExecutor,
@@ -147,6 +149,7 @@ public class Transitions implements RemoteCallable<Transitions> {
mContext = null;
mMainExecutor = null;
mAnimExecutor = null;
+ mDisplayController = null;
mPlayerImpl = null;
mRemoteTransitionHandler = null;
}
@@ -547,6 +550,17 @@ public class Transitions implements RemoteCallable<Transitions> {
break;
}
}
+ if (request.getDisplayChange() != null) {
+ TransitionRequestInfo.DisplayChange change = request.getDisplayChange();
+ if (change.getEndRotation() != change.getStartRotation()) {
+ // Is a rotation, so dispatch to all displayChange listeners
+ if (wct == null) {
+ wct = new WindowContainerTransaction();
+ }
+ mDisplayController.getChangeController().dispatchOnRotateDisplay(wct,
+ change.getDisplayId(), change.getStartRotation(), change.getEndRotation());
+ }
+ }
active.mToken = mOrganizer.startTransition(
request.getType(), transitionToken, wct);
mActiveTransitions.add(active);
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 023db13e18d5..178e99d375a0 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1672,7 +1672,7 @@ class ActivityStarter {
}
if (newTransition != null) {
transitionController.requestStartTransition(newTransition,
- mTargetTask, remoteTransition);
+ mTargetTask, remoteTransition, null /* displayChange */);
} else if (started) {
// Make the collecting transition wait until this request is ready.
transitionController.setReady(r, false);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 05b74dd67fa6..51c8dafa7c85 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -1387,7 +1387,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
task.mTransitionController.requestTransitionIfNeeded(TRANSIT_TO_FRONT,
0 /* flags */, task, task /* readyGroupRef */,
- options != null ? options.getRemoteTransition() : null);
+ options != null ? options.getRemoteTransition() : null,
+ null /* displayChange */);
reason = reason + " findTaskToMoveToFront";
boolean reparented = false;
if (task.isResizeable() && canUseActivityOptionsLaunchBounds(options)) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 44d36237b555..3167437720b9 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -224,6 +224,7 @@ import android.view.WindowManager.DisplayImePolicy;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
import android.window.DisplayWindowPolicyController;
import android.window.IDisplayAreaOrganizer;
+import android.window.TransitionRequestInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
@@ -1422,7 +1423,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (configChanged) {
mWaitingForConfig = true;
if (mTransitionController.isShellTransitionsEnabled()) {
- requestChangeTransitionIfNeeded(changes);
+ requestChangeTransitionIfNeeded(changes, null /* displayChange */);
} else {
mWmService.startFreezingDisplay(0 /* exitAnim */, 0 /* enterAnim */, this);
}
@@ -3217,15 +3218,20 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* Requests to start a transition for the display configuration change. The given changes must
* be non-zero. This method is no-op if the display has been collected.
*/
- void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes) {
+ void requestChangeTransitionIfNeeded(@ActivityInfo.Config int changes,
+ @Nullable TransitionRequestInfo.DisplayChange displayChange) {
final TransitionController controller = mTransitionController;
if (controller.isCollecting()) {
+ if (displayChange != null) {
+ throw new IllegalArgumentException("Provided displayChange for non-new transition");
+ }
if (!controller.isCollecting(this)) {
controller.collect(this);
}
return;
}
- final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, this);
+ final Transition t = controller.requestTransitionIfNeeded(TRANSIT_CHANGE, 0 /* flags */,
+ this, this, null /* remoteTransition */, displayChange);
if (t != null) {
mAtmService.startLaunchPowerMode(POWER_MODE_REASON_CHANGE_DISPLAY);
if (getRotation() != getWindowConfiguration().getRotation()) {
@@ -5692,7 +5698,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mWmService.mDisplayNotificationController.dispatchDisplayChanged(
this, getConfiguration());
if (isReady() && mTransitionController.isShellTransitionsEnabled()) {
- requestChangeTransitionIfNeeded(changes);
+ requestChangeTransitionIfNeeded(changes, null /* displayChange */);
}
}
return changes;
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index 4684cb18ebfb..ae0600790e65 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -62,6 +62,7 @@ import android.util.proto.ProtoOutputStream;
import android.view.IDisplayWindowRotationCallback;
import android.view.IWindowManager;
import android.view.Surface;
+import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
import com.android.internal.R;
@@ -509,8 +510,11 @@ public class DisplayRotation {
if (useShellTransitions) {
final boolean wasCollecting = mDisplayContent.mTransitionController.isCollecting();
+ final TransitionRequestInfo.DisplayChange change = wasCollecting ? null
+ : new TransitionRequestInfo.DisplayChange(mDisplayContent.getDisplayId(),
+ oldRotation, mRotation);
mDisplayContent.requestChangeTransitionIfNeeded(
- ActivityInfo.CONFIG_WINDOW_CONFIGURATION);
+ ActivityInfo.CONFIG_WINDOW_CONFIGURATION, change);
if (wasCollecting) {
// Use remote-rotation infra since the transition has already been requested
// TODO(shell-transitions): Remove this once lifecycle management can cover all
diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java
index 06030dd3cca1..ffe146219c6c 100644
--- a/services/core/java/com/android/server/wm/TransitionController.java
+++ b/services/core/java/com/android/server/wm/TransitionController.java
@@ -247,7 +247,7 @@ class TransitionController {
@WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger,
@NonNull WindowContainer readyGroupRef) {
return requestTransitionIfNeeded(type, flags, trigger, readyGroupRef,
- null /* remoteTransition */);
+ null /* remoteTransition */, null /* displayChange */);
}
private static boolean isExistenceType(@WindowManager.TransitionType int type) {
@@ -264,12 +264,16 @@ class TransitionController {
@Nullable
Transition requestTransitionIfNeeded(@WindowManager.TransitionType int type,
@WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger,
- @NonNull WindowContainer readyGroupRef, @Nullable RemoteTransition remoteTransition) {
+ @NonNull WindowContainer readyGroupRef, @Nullable RemoteTransition remoteTransition,
+ @Nullable TransitionRequestInfo.DisplayChange displayChange) {
if (mTransitionPlayer == null) {
return null;
}
Transition newTransition = null;
if (isCollecting()) {
+ if (displayChange != null) {
+ throw new IllegalArgumentException("Provided displayChange for a non-new request");
+ }
// Make the collecting transition wait until this request is ready.
mCollectingTransition.setReady(readyGroupRef, false);
if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
@@ -278,7 +282,7 @@ class TransitionController {
}
} else {
newTransition = requestStartTransition(createTransition(type, flags),
- trigger != null ? trigger.asTask() : null, remoteTransition);
+ trigger != null ? trigger.asTask() : null, remoteTransition, displayChange);
}
if (trigger != null) {
if (isExistenceType(type)) {
@@ -293,7 +297,8 @@ class TransitionController {
/** Asks the transition player (shell) to start a created but not yet started transition. */
@NonNull
Transition requestStartTransition(@NonNull Transition transition, @Nullable Task startTask,
- @Nullable RemoteTransition remoteTransition) {
+ @Nullable RemoteTransition remoteTransition,
+ @Nullable TransitionRequestInfo.DisplayChange displayChange) {
try {
ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS,
"Requesting StartTransition: %s", transition);
@@ -303,7 +308,7 @@ class TransitionController {
startTask.fillTaskInfo(info);
}
mTransitionPlayer.requestStartTransition(transition, new TransitionRequestInfo(
- transition.mType, info, remoteTransition));
+ transition.mType, info, remoteTransition, displayChange));
} catch (RemoteException e) {
Slog.e(TAG, "Error requesting transition", e);
transition.start();
@@ -317,7 +322,7 @@ class TransitionController {
if (wc.isVisibleRequested()) {
if (!isCollecting()) {
requestStartTransition(createTransition(TRANSIT_CLOSE, 0 /* flags */),
- wc.asTask(), null /* remoteTransition */);
+ wc.asTask(), null /* remoteTransition */, null /* displayChange */);
}
collectExistenceChange(wc);
} else {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index b7417c4e8dd0..a97c0571257e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -488,7 +488,8 @@ public class TransitionTests extends WindowTestsBase {
final TestTransitionPlayer player = registerTestTransitionPlayer();
mDisplayContent.getDisplayRotation().setRotation(mDisplayContent.getRotation() + 1);
- mDisplayContent.requestChangeTransitionIfNeeded(1 /* any changes */);
+ mDisplayContent.requestChangeTransitionIfNeeded(1 /* any changes */,
+ null /* displayChange */);
final FadeRotationAnimationController fadeController =
mDisplayContent.getFadeRotationAnimationController();
assertNotNull(fadeController);